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`.
This commit is contained in:
Sönke Holz 2023-09-11 22:13:32 +02:00 committed by Andrew Kaster
parent a95c2ed978
commit a65d6e5e50
Notes: sideshowbarker 2024-07-17 18:49:10 +09:00

View File

@ -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