瀏覽代碼

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`.
Sönke Holz 1 年之前
父節點
當前提交
a65d6e5e50
共有 1 個文件被更改,包括 15 次插入2 次删除
  1. 15 2
      Userland/Libraries/LibELF/DynamicObject.cpp

+ 15 - 2
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