diff options
author | Nico Weber <thakis@chromium.org> | 2020-08-08 22:08:13 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-09 21:12:54 +0200 |
commit | 9c136be08b30ae886c4cce2ead9a32b4e6359e3d (patch) | |
tree | 2235f2f8203524ff08d4fe5141cc2c0aae470ef7 | |
parent | 44a776567672d70be868a9603a1962372470df0b (diff) | |
download | serenity-9c136be08b30ae886c4cce2ead9a32b4e6359e3d.zip |
disasm: For ELF files, disassemble .text section
Since disasm is built in lagom, this requires adding LibELF to lagom.
-rw-r--r-- | Meta/Lagom/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Userland/disasm.cpp | 23 |
2 files changed, 23 insertions, 3 deletions
diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 9562d18513..23f6307de3 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -43,6 +43,7 @@ endif() file(GLOB AK_SOURCES "../../AK/*.cpp") file(GLOB LIBCORE_SOURCES "../../Libraries/LibCore/*.cpp") +file(GLOB LIBELF_SOURCES "../../Libraries/LibELF/*.cpp") file(GLOB LIBGEMINI_SOURCES "../../Libraries/LibGemini/*.cpp") file(GLOB LIBGFX_SOURCES "../../Libraries/LibGfx/*.cpp") file(GLOB LIBIPC_SOURCES "../../Libraries/LibIPC/*.cpp") @@ -60,7 +61,7 @@ file(GLOB SHELL_SOURCES "../../Shell/*.cpp") file(GLOB SHELL_TESTS "../../Shell/Tests/*.sh") set(LAGOM_CORE_SOURCES ${AK_SOURCES} ${LIBCORE_SOURCES}) -set(LAGOM_MORE_SOURCES ${LIBIPC_SOURCES} ${LIBLINE_SOURCES} ${LIBJS_SOURCES} ${LIBJS_SUBDIR_SOURCES} ${LIBX86_SOURCES} ${LIBCRYPTO_SOURCES} ${LIBCOMPRESS_SOURCES} ${LIBCRYPTO_SUBDIR_SOURCES} ${LIBTLS_SOURCES} ${LIBMARKDOWN_SOURCES} ${LIBGEMINI_SOURCES} ${LIBGFX_SOURCES}) +set(LAGOM_MORE_SOURCES ${LIBELF_SOURCES} ${LIBIPC_SOURCES} ${LIBLINE_SOURCES} ${LIBJS_SOURCES} ${LIBJS_SUBDIR_SOURCES} ${LIBX86_SOURCES} ${LIBCRYPTO_SOURCES} ${LIBCOMPRESS_SOURCES} ${LIBCRYPTO_SUBDIR_SOURCES} ${LIBTLS_SOURCES} ${LIBMARKDOWN_SOURCES} ${LIBGEMINI_SOURCES} ${LIBGFX_SOURCES}) include_directories (../../) include_directories (../../Libraries/) diff --git a/Userland/disasm.cpp b/Userland/disasm.cpp index a9fd354fc3..80300b5920 100644 --- a/Userland/disasm.cpp +++ b/Userland/disasm.cpp @@ -27,8 +27,10 @@ #include <AK/LogStream.h> #include <AK/MappedFile.h> #include <LibCore/ArgsParser.h> +#include <LibELF/Loader.h> #include <LibX86/Disassembler.h> #include <stdio.h> +#include <string.h> int main(int argc, char** argv) { @@ -44,7 +46,24 @@ int main(int argc, char** argv) return 1; } - X86::SimpleInstructionStream stream((const u8*)file.data(), file.size()); + const u8* asm_data = (const u8*)file.data(); + size_t asm_size = file.size(); + size_t file_offset = 0; + if (asm_size >= 4 && strncmp((const char*)asm_data, "\u007fELF", 4) == 0) { + if (auto elf = ELF::Loader::create(asm_data, asm_size)) { + elf->image().for_each_section_of_type(SHT_PROGBITS, [&](const ELF::Image::Section& section) { + // FIXME: Disassemble all SHT_PROGBITS sections, not just .text. + if (section.name() != ".text") + return IterationDecision::Continue; + asm_data = (const u8*)section.raw_data(); + asm_size = section.size(); + file_offset = section.address(); + return IterationDecision::Break; + }); + } + } + + X86::SimpleInstructionStream stream(asm_data, asm_size); X86::Disassembler disassembler(stream); for (;;) { @@ -52,7 +71,7 @@ int main(int argc, char** argv) auto insn = disassembler.next(); if (!insn.has_value()) break; - out() << String::format("%08x", offset) << " " << insn.value().to_string(offset); + out() << String::format("%08x", file_offset + offset) << " " << insn.value().to_string(offset); } return 0; |