From d2e0fa79faa37ee16126545c015adaca9322eb57 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Wed, 1 Apr 2026 19:07:31 +0100 Subject: [PATCH] ld: implement GLOB_DAT and 64 relocation types --- sys/ld/elf.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/sys/ld/elf.c b/sys/ld/elf.c index 77b7677..5601a2f 100644 --- a/sys/ld/elf.c +++ b/sys/ld/elf.c @@ -183,7 +183,7 @@ static int map_image(struct elf_image *image) } } - kern_logf("ld: image %s -> %zx", image->e_leaf.l_name, image->e_base); + kern_tracef("ld: image %s -> %zx", image->e_leaf.l_name, image->e_base); return SUCCESS; } @@ -291,6 +291,34 @@ static int do_rela(struct elf_image *image, elf_rela_t *rela, bool lazy) ELF64_R_SYM(rela->r_info), rela->r_addend); break; + case R_X86_64_GLOB_DAT: + sym = get_dynsym(image, ELF64_R_SYM(rela->r_info)); + if (!sym) { + return ENOEXEC; + } + + *(uint64_t *)(image->e_base + rela->r_offset) + = image->e_base + sym->st_value + rela->r_addend; + kern_tracef( + "GLOB_DAT: offset=%zx, symbol=%zu, addend=%zx", + rela->r_offset, + ELF64_R_SYM(rela->r_info), + rela->r_addend); + break; + case R_X86_64_64: + sym = get_dynsym(image, ELF64_R_SYM(rela->r_info)); + if (!sym) { + return ENOEXEC; + } + + *(uint64_t *)(image->e_base + rela->r_offset) + = image->e_base + sym->st_value + rela->r_addend; + kern_tracef( + "64: offset=%zx, symbol=%zu, addend=%zx", + rela->r_offset, + ELF64_R_SYM(rela->r_info), + rela->r_addend); + break; case R_X86_64_RELATIVE: *(uint64_t *)(image->e_base + rela->r_offset) = image->e_base + rela->r_addend;