From a65d6e5e50dfba890d57bf6e6262e8ab579da684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Mon, 11 Sep 2023 22:13:32 +0200 Subject: [PATCH] LibELF: Use the first `PT_LOAD` element to calculate base address Other element types (like `PT_RISCV_ATTRIBUTES`) might not have a correct `p_vaddr`. --- Userland/Libraries/LibELF/DynamicObject.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibELF/DynamicObject.cpp b/Userland/Libraries/LibELF/DynamicObject.cpp index b4abb6f2ee..54d03c4de8 100644 --- a/Userland/Libraries/LibELF/DynamicObject.cpp +++ b/Userland/Libraries/LibELF/DynamicObject.cpp @@ -22,8 +22,21 @@ DynamicObject::DynamicObject(DeprecatedString const& filepath, VirtualAddress ba , m_dynamic_address(dynamic_section_address) { auto* header = (ElfW(Ehdr)*)base_address.as_ptr(); - auto* pheader = (ElfW(Phdr)*)(base_address.as_ptr() + header->e_phoff); - m_elf_base_address = VirtualAddress(pheader->p_vaddr - pheader->p_offset); + auto* const phdrs = program_headers(); + + // Calculate the base address using the PT_LOAD element with the lowest `p_vaddr` (which is the first element) + for (size_t i = 0; i < program_header_count(); ++i) { + auto pheader = phdrs[i]; + if (pheader.p_type == PT_LOAD) { + m_elf_base_address = VirtualAddress { pheader.p_vaddr - pheader.p_offset }; + break; + } + + if (i == program_header_count() - 1) { + VERIFY_NOT_REACHED(); + } + } + if (header->e_type == ET_DYN) m_is_elf_dynamic = true; else