From 2765122e6728f82ddf267bd6c864edb73d39bdd2 Mon Sep 17 00:00:00 2001 From: Callum Farmer Date: Thu, 4 Jul 2024 15:15:36 +0100 Subject: [PATCH] X86_64: We use RELA not REL Weird huh? GNU ld uses RELA but no addends, as soon as you get an addend from LLD, this code breaks Signed-off-by: Callum Farmer --- gnuefi/reloc_x86_64.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gnuefi/reloc_x86_64.c b/gnuefi/reloc_x86_64.c index 04b75b2..525396a 100644 --- a/gnuefi/reloc_x86_64.c +++ b/gnuefi/reloc_x86_64.c @@ -45,14 +45,14 @@ EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0; - Elf64_Rel *rel = 0; + Elf64_Rela *rel = 0; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_RELA: - rel = (Elf64_Rel*) + rel = (Elf64_Rela*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; @@ -85,13 +85,13 @@ EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn, case R_X86_64_RELATIVE: addr = (unsigned long *) (ldbase + rel->r_offset); - *addr += ldbase; + *addr = ldbase + rel->r_addend; break; default: break; } - rel = (Elf64_Rel*) ((char *) rel + relent); + rel = (Elf64_Rela*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS;