From 336321b113d58ad2ed4332092ec1313b6a48717e Mon Sep 17 00:00:00 2001 From: Fredrik Holmqvist Date: Tue, 31 Aug 2021 20:22:15 +0200 Subject: [PATCH] AARCH64: Implement enough of relocations to get kernel loaded --- src/system/kernel/arch/arm64/arch_elf.cpp | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/system/kernel/arch/arm64/arch_elf.cpp b/src/system/kernel/arch/arm64/arch_elf.cpp index bbb957b5aa..a2ca4c47e9 100644 --- a/src/system/kernel/arch/arm64/arch_elf.cpp +++ b/src/system/kernel/arch/arm64/arch_elf.cpp @@ -86,11 +86,42 @@ arch_elf_relocate_rela(struct elf_image_info *image, // Calculate the relocation value. Elf64_Addr relocValue; 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: dprintf("arch_elf_relocate_rela: unhandled relocation type %d\n", type); return B_BAD_DATA; } + #ifdef _BOOT_MODE boot_elf64_set_relocation(relocAddr, relocValue); #else