From 06c9c14995aebb2dc63926099778b77a402e82ae Mon Sep 17 00:00:00 2001 From: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 28 Jan 2025 23:26:28 -0600 Subject: [PATCH] Return an optional from lookup_symbol --- src/binary/elf.cpp | 15 ++++++++------- src/binary/elf.hpp | 2 +- src/binary/mach-o.cpp | 6 +++--- src/binary/mach-o.hpp | 2 +- src/symbols/symbols_with_libdwarf.cpp | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/binary/elf.cpp b/src/binary/elf.cpp index 7dcf956..83ca628 100644 --- a/src/binary/elf.cpp +++ b/src/binary/elf.cpp @@ -1,4 +1,5 @@ #include "binary/elf.hpp" +#include "utils/optional.hpp" #if IS_LINUX @@ -88,23 +89,23 @@ namespace detail { return 0; } - std::string elf::lookup_symbol(frame_ptr pc) { + optional elf::lookup_symbol(frame_ptr pc) { // TODO: Also search the SHT_DYNSYM at some point, maybe auto symtab_ = get_symtab(); if(symtab_.is_error()) { - return ""; + return nullopt; } auto& maybe_symtab = symtab_.unwrap_value(); if(!maybe_symtab) { - return ""; + return nullopt; } auto& symtab = maybe_symtab.unwrap(); if(symtab.strtab_link == SHN_UNDEF) { - return ""; + return nullopt; } auto strtab_ = get_strtab(symtab.strtab_link); if(strtab_.is_error()) { - return ""; + return nullopt; } auto& strtab = strtab_.unwrap_value(); auto it = first_less_than_or_equal( @@ -116,12 +117,12 @@ namespace detail { } ); if(it == symtab.entries.end()) { - return ""; + return nullopt; } if(pc <= it->st_value + it->st_size) { return strtab.data() + it->st_name; } - return ""; + return nullopt; } template::value, int>::type> diff --git a/src/binary/elf.hpp b/src/binary/elf.hpp index 102ea49..59fe90e 100644 --- a/src/binary/elf.hpp +++ b/src/binary/elf.hpp @@ -76,7 +76,7 @@ namespace detail { Result get_module_image_base_impl(); public: - std::string lookup_symbol(frame_ptr pc); + optional lookup_symbol(frame_ptr pc); private: template::value, int>::type = 0> diff --git a/src/binary/mach-o.cpp b/src/binary/mach-o.cpp index d25a41e..90823c6 100644 --- a/src/binary/mach-o.cpp +++ b/src/binary/mach-o.cpp @@ -416,10 +416,10 @@ namespace detail { return symbols.unwrap(); } - std::string mach_o::lookup_symbol(frame_ptr pc) { + optional mach_o::lookup_symbol(frame_ptr pc) { auto symtab_ = symbol_table(); if(!symtab_) { - return ""; + return nullopt; } const auto& symtab = symtab_.unwrap_value();; auto it = first_less_than_or_equal( @@ -431,7 +431,7 @@ namespace detail { } ); if(it == symtab.end()) { - return ""; + return nullopt; } ASSERT(pc >= it->address); // TODO: We subtracted one from the address so name + diff won't show up in the objdump, decide if desirable diff --git a/src/binary/mach-o.hpp b/src/binary/mach-o.hpp index 82a36c5..506756e 100644 --- a/src/binary/mach-o.hpp +++ b/src/binary/mach-o.hpp @@ -112,7 +112,7 @@ namespace detail { Result&, internal_error> symbol_table(); - std::string lookup_symbol(frame_ptr pc); + optional lookup_symbol(frame_ptr pc); // produce information similar to dsymutil -dump-debug-map static void print_debug_map(const debug_map& debug_map); diff --git a/src/symbols/symbols_with_libdwarf.cpp b/src/symbols/symbols_with_libdwarf.cpp index dcbfa3c..abd54cf 100644 --- a/src/symbols/symbols_with_libdwarf.cpp +++ b/src/symbols/symbols_with_libdwarf.cpp @@ -116,7 +116,7 @@ namespace libdwarf { } #if IS_LINUX || IS_APPLE if(frame.frame.symbol.empty() && object.has_value()) { - frame.frame.symbol = object.unwrap_value().lookup_symbol(dlframe.object_address); + frame.frame.symbol = object.unwrap_value().lookup_symbol(dlframe.object_address).value_or(""); } #endif }