Pārlūkot izejas kodu

LibX86: Take load base address into consideration during disassembly

Since our executables are position-independent, the address values
extraced from processes don't correspond to their values within the ELF
file. We have to offset the absolute addresses by the load base address
to get the relative symbol that we need for disassembly.
Daniel Bertalan 3 gadi atpakaļ
vecāks
revīzija
15a14d3d21

+ 1 - 1
Userland/DevTools/Profiler/DisassemblyModel.cpp

@@ -87,7 +87,7 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node)
     auto symbol_offset_from_function_start = node.address() - base_address - symbol->value();
     auto symbol_offset_from_function_start = node.address() - base_address - symbol->value();
     auto view = symbol.value().raw_data().substring_view(symbol_offset_from_function_start);
     auto view = symbol.value().raw_data().substring_view(symbol_offset_from_function_start);
 
 
-    X86::ELFSymbolProvider symbol_provider(*elf);
+    X86::ELFSymbolProvider symbol_provider(*elf, base_address);
     X86::SimpleInstructionStream stream((const u8*)view.characters_without_null_termination(), view.length());
     X86::SimpleInstructionStream stream((const u8*)view.characters_without_null_termination(), view.length());
     X86::Disassembler disassembler(stream);
     X86::Disassembler disassembler(stream);
 
 

+ 5 - 3
Userland/Libraries/LibX86/ELFSymbolProvider.h

@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2020, the SerenityOS developers.
+ * Copyright (c) 2020-2021, the SerenityOS developers.
  *
  *
  * SPDX-License-Identifier: BSD-2-Clause
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
@@ -13,17 +13,19 @@ namespace X86 {
 
 
 class ELFSymbolProvider final : public SymbolProvider {
 class ELFSymbolProvider final : public SymbolProvider {
 public:
 public:
-    ELFSymbolProvider(const ELF::Image& elf)
+    ELFSymbolProvider(const ELF::Image& elf, FlatPtr base_address = 0)
         : m_elf(elf)
         : m_elf(elf)
+        , m_base_address(base_address)
     {
     {
     }
     }
 
 
     virtual String symbolicate(FlatPtr address, u32* offset = nullptr) const override
     virtual String symbolicate(FlatPtr address, u32* offset = nullptr) const override
     {
     {
-        return m_elf.symbolicate(address, offset);
+        return m_elf.symbolicate(address - m_base_address, offset);
     }
     }
 
 
 private:
 private:
     const ELF::Image& m_elf;
     const ELF::Image& m_elf;
+    FlatPtr m_base_address;
 };
 };
 }
 }