AARCH64: Implement enough of relocations to get kernel loaded
This commit is contained in:
@@ -86,11 +86,42 @@ arch_elf_relocate_rela(struct elf_image_info *image,
|
|||||||
// Calculate the relocation value.
|
// Calculate the relocation value.
|
||||||
Elf64_Addr relocValue;
|
Elf64_Addr relocValue;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case R_AARCH64_NONE:
|
||||||
|
continue;
|
||||||
|
case R_AARCH64_ABS64:
|
||||||
|
relocValue = symAddr + rel[i].r_addend;
|
||||||
|
break;
|
||||||
|
case R_AARCH64_ABS32:
|
||||||
|
case R_AARCH64_ABS16:
|
||||||
|
case R_AARCH64_PREL64:
|
||||||
|
case R_AARCH64_PREL32:
|
||||||
|
case R_AARCH64_PREL16:
|
||||||
|
case R_AARCH64_TSTBR14:
|
||||||
|
case R_AARCH64_CONDBR19:
|
||||||
|
case R_AARCH64_JUMP26:
|
||||||
|
case R_AARCH64_CALL26:
|
||||||
|
case R_AARCH64_COPY:
|
||||||
|
dprintf("arch_elf_relocate_rela: unhandled relocation type %d\n",
|
||||||
|
type);
|
||||||
|
return B_BAD_DATA;
|
||||||
|
case R_AARCH64_GLOB_DAT:
|
||||||
|
case R_AARCH64_JUMP_SLOT:
|
||||||
|
relocValue = symAddr + rel[i].r_addend;
|
||||||
|
break;
|
||||||
|
case R_AARCH64_RELATIVE:
|
||||||
|
relocValue = image->text_region.delta + rel[i].r_addend;
|
||||||
|
break;
|
||||||
|
case R_AARCH64_TLS_DTPREL64:
|
||||||
|
case R_AARCH64_TLS_DTPMOD64:
|
||||||
|
case R_AARCH64_TLS_TPREL64:
|
||||||
|
case R_AARCH64_TLSDESC:
|
||||||
|
case R_AARCH64_IRELATIVE:
|
||||||
default:
|
default:
|
||||||
dprintf("arch_elf_relocate_rela: unhandled relocation type %d\n",
|
dprintf("arch_elf_relocate_rela: unhandled relocation type %d\n",
|
||||||
type);
|
type);
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _BOOT_MODE
|
#ifdef _BOOT_MODE
|
||||||
boot_elf64_set_relocation(relocAddr, relocValue);
|
boot_elf64_set_relocation(relocAddr, relocValue);
|
||||||
#else
|
#else
|
||||||
|
|||||||
Reference in New Issue
Block a user