From 3f0a77e78816682c67bbc3294095e4d31afda252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Tue, 17 Oct 2023 19:05:27 +0200 Subject: [PATCH] disasm: Allow disassembling just one symbol This is done in a crude way for now in that we disassemble all instructions up to the symbol without printing them. --- Userland/Utilities/disasm.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Userland/Utilities/disasm.cpp b/Userland/Utilities/disasm.cpp index 97125cb006..b8684a05e7 100644 --- a/Userland/Utilities/disasm.cpp +++ b/Userland/Utilities/disasm.cpp @@ -41,12 +41,14 @@ struct Symbol { ErrorOr serenity_main(Main::Arguments args) { StringView path {}; + StringView target_symbol; Core::ArgsParser args_parser; args_parser.set_general_help( "Disassemble an executable, and show human-readable " "assembly code for each function."); - args_parser.add_positional_argument(path, "Path to i386 binary file", "path"); + args_parser.add_positional_argument(path, "Path to binary file", "path"); + args_parser.add_option(target_symbol, "Show disassembly only for a specific symbol", "symbol", 's', "symbol"); args_parser.parse(args); OwnPtr file; @@ -120,6 +122,7 @@ ErrorOr serenity_main(Main::Arguments args) Vector::Iterator current_zero_size_symbol = zero_size_symbols.begin(); bool is_first_symbol = true; bool current_instruction_is_in_symbol = false; + bool found_symbol = false; for (;;) { auto offset = stream.offset(); @@ -182,6 +185,16 @@ ErrorOr serenity_main(Main::Arguments args) is_first_symbol = false; } + // Past the target symbol now; no need to disassemble more. + if (found_symbol && current_ranged_symbol->name != target_symbol) + break; + + found_symbol = !target_symbol.is_empty() && current_ranged_symbol->name == target_symbol; + + // We have not found the target symbol yet; don't print anything. + if (!target_symbol.is_empty() && current_ranged_symbol->name != target_symbol) + continue; + // Insert extra newline after the "dangling" symbols. if (needs_separator) outln();