mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-11 13:36:13 +03:00
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:
parent
a95c2ed978
commit
a65d6e5e50
Notes:
sideshowbarker
2024-07-17 18:49:10 +09:00
Author: https://github.com/spholz Commit: https://github.com/SerenityOS/serenity/commit/a65d6e5e50 Pull-request: https://github.com/SerenityOS/serenity/pull/21034 Reviewed-by: https://github.com/ADKaster ✅
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user