Skip to content

Commit 6b7edeb

Browse files
committed
Add --demangle and --prune options to symbol table tool
1 parent ce058ad commit 6b7edeb

File tree

1 file changed

+38
-17
lines changed

1 file changed

+38
-17
lines changed

tools/symbol_tables/main.cpp

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,24 @@
99

1010
#include "binary/elf.hpp"
1111
#include "binary/mach-o.hpp"
12+
#include "cpptrace/utils.hpp"
1213

1314
using namespace std::literals;
1415
using namespace cpptrace::detail;
1516

1617
template<> struct fmt::formatter<lyra::cli> : ostream_formatter {};
1718

19+
struct options {
20+
std::filesystem::path path;
21+
bool demangle = false;
22+
bool prune = false;
23+
};
24+
1825
#if IS_LINUX
19-
void dump_symtab_result(const Result<optional<std::vector<elf::symbol_entry>>, internal_error>& res) {
26+
void dump_symtab_result(
27+
const Result<optional<std::vector<elf::symbol_entry>>, internal_error>& res,
28+
const options& options
29+
) {
2030
if(!res) {
2131
fmt::println(stderr, "Error loading: {}", res.unwrap_error().what());
2232
}
@@ -27,7 +37,16 @@ void dump_symtab_result(const Result<optional<std::vector<elf::symbol_entry>>, i
2737
const auto& entries = entries_.unwrap();
2838
fmt::println("{:16} {:16} {:4} {}", "value", "size", "shdx", "symbol");
2939
for(const auto& entry : entries) {
30-
fmt::println("{:016x} {:016x} {:04x} {}", entry.st_value, entry.st_size, entry.st_shndx, entry.st_name);
40+
std::string name;
41+
if(options.demangle) {
42+
name = cpptrace::demangle(entry.st_name);
43+
if(options.prune) {
44+
name = cpptrace::prune_symbol(name);
45+
}
46+
} else {
47+
name = entry.st_name;
48+
}
49+
fmt::println("{:016x} {:016x} {:04x} {}", entry.st_value, entry.st_size, entry.st_shndx, name);
3150
}
3251
}
3352

@@ -39,17 +58,17 @@ auto get_elf(const std::filesystem::path& path) {
3958
return std::move(elf_).unwrap_value();
4059
}
4160

42-
void dump_symbols(const std::filesystem::path& path) {
43-
auto elf = get_elf(path);
61+
void dump_symbols(const options& options) {
62+
auto elf = get_elf(options.path);
4463
fmt::println("Symtab:");
45-
dump_symtab_result(elf.get_symtab_entries());
64+
dump_symtab_result(elf.get_symtab_entries(), options);
4665
fmt::println("Dynamic symtab:");
47-
dump_symtab_result(elf.get_dynamic_symtab_entries());
66+
dump_symtab_result(elf.get_dynamic_symtab_entries(), options);
4867
}
49-
void lookup_symbol(const std::filesystem::path& path, cpptrace::frame_ptr address) {
50-
auto elf = get_elf(path);
68+
void lookup_symbol(const options& options, cpptrace::frame_ptr address) {
69+
auto elf = get_elf(options.path);
5170
if(auto symbol = elf.lookup_symbol(address)) {
52-
fmt::println("Symbol: {}", symbol.unwrap());
71+
fmt::println("Symbol: {}", options.demangle ? cpptrace::demangle(symbol.unwrap()) : symbol.unwrap());
5372
} else {
5473
fmt::println("Could not find symbol");
5574
}
@@ -72,12 +91,14 @@ void lookup_symbol(const std::filesystem::path&, cpptrace::frame_ptr) {
7291

7392
int symbol_tables(int argc, char** argv) {
7493
bool show_help = false;
75-
std::filesystem::path path;
7694
std::optional<std::string> lookup;
95+
options options;
7796
auto cli = lyra::cli()
7897
| lyra::help(show_help)
7998
| lyra::opt(lookup, "address")["--lookup"]("address in hex to lookup")
80-
| lyra::arg(path, "binary path")("binary to dump symbol tables for").required();
99+
| lyra::opt(options.demangle)["--demangle"]("demangle the symbol")
100+
| lyra::opt(options.prune)["--prune"]("prune the symbol")
101+
| lyra::arg(options.path, "binary path")("binary to dump symbol tables for").required();
81102
if(auto result = cli.parse({ argc, argv }); !result) {
82103
fmt::println(stderr, "Error in command line: {}", result.message());
83104
fmt::println("{}", cli);
@@ -87,21 +108,21 @@ int symbol_tables(int argc, char** argv) {
87108
fmt::println("{}", cli);
88109
return 0;
89110
}
90-
if(!std::filesystem::exists(path)) {
91-
fmt::println(stderr, "Error: Path doesn't exist {}", path);
111+
if(!std::filesystem::exists(options.path)) {
112+
fmt::println(stderr, "Error: Path doesn't exist {}", options.path);
92113
return 1;
93114
}
94-
if(!std::filesystem::is_regular_file(path)) {
95-
fmt::println(stderr, "Error: Path isn't a regular file {}", path);
115+
if(!std::filesystem::is_regular_file(options.path)) {
116+
fmt::println(stderr, "Error: Path isn't a regular file {}", options.path);
96117
return 1;
97118
}
98119
if(lookup) {
99120
auto address = std::stoull(*lookup, nullptr, 16);
100121
fmt::println(stderr, "Looking up address {:016x}", address);
101-
lookup_symbol(path, address);
122+
lookup_symbol(options, address);
102123
return 0;
103124
}
104-
dump_symbols(path);
125+
dump_symbols(options);
105126
return 0;
106127
}
107128

0 commit comments

Comments
 (0)