From aa8be130f9b61aa6bcbab7d24df1bb8f18c24408 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 20 May 2026 05:02:48 +0300 Subject: [PATCH] DynamicLoader: Cleanup lazy PLT relocations --- userspace/programs/DynamicLoader/main.cpp | 52 ++++------------------- 1 file changed, 9 insertions(+), 43 deletions(-) diff --git a/userspace/programs/DynamicLoader/main.cpp b/userspace/programs/DynamicLoader/main.cpp index e669d13a..79272ac3 100644 --- a/userspace/programs/DynamicLoader/main.cpp +++ b/userspace/programs/DynamicLoader/main.cpp @@ -700,50 +700,16 @@ static void relocate_elf(LoadedElf& elf, bool lazy_load) } else { - const size_t pltrelent = (elf.pltrel == DT_REL) - ? sizeof(ElfNativeRelocation) - : sizeof(ElfNativeRelocationA); - - for (size_t i = 0; i < elf.pltrelsz / pltrelent; i++) + switch (elf.pltrel) { - const auto info = (elf.pltrel == DT_REL) - ? reinterpret_cast(elf.jmprel)[i].r_info - : reinterpret_cast(elf.jmprel)[i].r_info; - const auto offset = (elf.pltrel == DT_REL) - ? reinterpret_cast(elf.jmprel)[i].r_offset - : reinterpret_cast(elf.jmprel)[i].r_offset; - -#if defined(__x86_64__) - if (ELF64_R_TYPE(info) != R_X86_64_JUMP_SLOT) - print_error_and_exit("jmprel relocation not R_X86_64_JUMP_SLOT", 0); -#elif defined(__i686__) - if (ELF32_R_TYPE(info) != R_386_JMP_SLOT) - print_error_and_exit("jmprel relocation not R_386_JMP_SLOT", 0); -#else - #error "unsupported architecture" -#endif - - bool do_relocation = false; - - if (const uint32_t symbol_index = ELF_R_SYM(info)) - { - const auto& symbol = *reinterpret_cast(elf.symtab + symbol_index * elf.syment); - const char* symbol_name = reinterpret_cast(elf.strtab + symbol.st_name); - if (strcmp(symbol_name, "__tls_get_addr") == 0 || strcmp(symbol_name, "___tls_get_addr") == 0) - do_relocation = true; - } - - if (!do_relocation) - *reinterpret_cast(elf.base + offset) += elf.base; - else switch (elf.pltrel) - { - case DT_REL: - handle_relocation(elf, reinterpret_cast(elf.jmprel)[i], true); - break; - case DT_RELA: - handle_relocation(elf, reinterpret_cast(elf.jmprel)[i], true); - break; - } + case DT_REL: + for (size_t i = 0; i < elf.pltrelsz / sizeof(ElfNativeRelocation); i++) + *reinterpret_cast(elf.base + reinterpret_cast(elf.jmprel)[i].r_offset) += elf.base; + break; + case DT_RELA: + for (size_t i = 0; i < elf.pltrelsz / sizeof(ElfNativeRelocationA); i++) + *reinterpret_cast(elf.base + reinterpret_cast(elf.jmprel)[i].r_offset) += elf.base; + break; } } }