From 106a620dfca6e8113e8e515e36e2c0e6e820c70e Mon Sep 17 00:00:00 2001 From: Gabriel Ionita Date: Sat, 25 Oct 2025 15:10:00 +0100 Subject: [PATCH] implement find_global_var to locate variable by name --- src/symbol.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/symbol.cpp b/src/symbol.cpp index d5af909..93ed08a 100644 --- a/src/symbol.cpp +++ b/src/symbol.cpp @@ -224,6 +224,73 @@ size_t Symbol::get_var_size(Dwarf_Debug dbg, Dwarf_Die die) { return byte_size; } +std::optional Symbol::find_global_var(Dwarf_Debug dbg, const std::string &var_name) { + Dwarf_Error err; + Dwarf_Unsigned cu_hdr_len, abbr_offset, next_cu_hdr; + Dwarf_Half ver_stamp, addr_sz; + Dwarf_Half length_size, extension_size; + Dwarf_Sig8 type_signature; + Dwarf_Unsigned typeoffset; + Dwarf_Half header_cu_type; + + // Iterate through all compilation units + while (dwarf_next_cu_header_d(dbg, true, &cu_hdr_len, &ver_stamp, &abbr_offset, + &addr_sz, &length_size, &extension_size, + &type_signature, &typeoffset, &next_cu_hdr, + &header_cu_type, &err) == DW_DLV_OK) { + + Dwarf_Die cu_die = nullptr; + + // Get the compilation unit DIE + if (dwarf_siblingof_b(dbg, nullptr, true, &cu_die, &err) != DW_DLV_OK) + continue; + + // Get the first child DIE + Dwarf_Die child_die = nullptr; + if (dwarf_child(cu_die, &child_die, &err) != DW_DLV_OK) { + dwarf_dealloc(dbg, cu_die, DW_DLA_DIE); + continue; + } + + // Iterate through all child DIEs + while (child_die != nullptr) { + Dwarf_Half tag; + + if (dwarf_tag(child_die, &tag, &err) == DW_DLV_OK && tag == DW_TAG_variable) { + char *name = nullptr; + + if (dwarf_diename(child_die, &name, &err) == DW_DLV_OK && name) { + if (var_name == name) { + Dwarf_Addr addr = get_global_var_addr(dbg, child_die); + size_t size = get_var_size(dbg, child_die); + + VarInfo info{std::string(name), addr, size}; + dwarf_dealloc(dbg, name, DW_DLA_STRING); + dwarf_dealloc(dbg, child_die, DW_DLA_DIE); + dwarf_dealloc(dbg, cu_die, DW_DLA_DIE); + return info; + } + dwarf_dealloc(dbg, name, DW_DLA_STRING); + } + } + + // Move to the next sibling + Dwarf_Die next_die = nullptr; + int rc = dwarf_siblingof_c(child_die, &next_die, &err); + + dwarf_dealloc(dbg, child_die, DW_DLA_DIE); + child_die = next_die; + + if (rc != DW_DLV_OK) + break; + } + + dwarf_dealloc(dbg, cu_die, DW_DLA_DIE); + } + + return std::nullopt; +} + void Symbol::list_global_integer_vars(Dwarf_Debug dbg) { Dwarf_Error err; Dwarf_Unsigned cu_hdr_len, abbr_offset, next_cu_hdr;