From 8c5fa1c0b8b9c01b121afbdfd99da381b573edd9 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 4 Apr 2026 22:31:00 +0300 Subject: [PATCH] DynamicLoader: Fix R_386_PC32 relocation I was not accounting elf base with offset --- userspace/programs/DynamicLoader/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/userspace/programs/DynamicLoader/main.cpp b/userspace/programs/DynamicLoader/main.cpp index 11405bca..e0fca56d 100644 --- a/userspace/programs/DynamicLoader/main.cpp +++ b/userspace/programs/DynamicLoader/main.cpp @@ -455,15 +455,15 @@ static void handle_tls_relocation(const LoadedElf& elf, const RelocT& reloc) #elif defined(__i686__) switch (ELF32_R_TYPE(reloc.r_info)) { - case R_386_TLS_TPOFF: - *reinterpret_cast(elf.base + reloc.r_offset) = symbol_offset - symbol_elf->tls_offset; - break; case R_386_TLS_DTPMOD32: *reinterpret_cast(elf.base + reloc.r_offset) = symbol_elf->tls_module; break; case R_386_TLS_DTPOFF32: *reinterpret_cast(elf.base + reloc.r_offset) = symbol_offset; break; + case R_386_TLS_TPOFF: + *reinterpret_cast(elf.base + reloc.r_offset) = symbol_offset - symbol_elf->tls_offset; + break; default: print(STDERR_FILENO, "unsupported tls reloc type "); print_uint(STDERR_FILENO, ELF32_R_TYPE(reloc.r_info)); @@ -589,7 +589,7 @@ static uintptr_t handle_relocation(const LoadedElf& elf, const RelocT& reloc, bo break; case R_386_PC32: size = 4; - value = symbol_address - reloc.r_offset; + value = symbol_address - (elf.base + reloc.r_offset); add_addend = true; break; case R_386_GLOB_DAT: