From 5b73fb82d272aa32ff124a69e96579679e7d3580 Mon Sep 17 00:00:00 2001 From: KyleMiles Date: Tue, 22 Aug 2023 13:01:09 -0400 Subject: DWARF Import : Improved Cross-Compilation-Unit Handling --- rust/examples/dwarf/dwarf_import/src/lib.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'rust/examples/dwarf/dwarf_import/src/lib.rs') diff --git a/rust/examples/dwarf/dwarf_import/src/lib.rs b/rust/examples/dwarf/dwarf_import/src/lib.rs index 69fe42aa..4a0d5a97 100644 --- a/rust/examples/dwarf/dwarf_import/src/lib.rs +++ b/rust/examples/dwarf/dwarf_import/src/lib.rs @@ -20,7 +20,7 @@ mod types; use crate::dwarfdebuginfo::DebugInfoBuilder; use crate::functions::parse_function_entry; -use crate::helpers::{get_name, get_uid}; +use crate::helpers::{get_attr_die, get_name, get_uid}; use crate::types::parse_data_variable; use binaryninja::{ @@ -33,10 +33,7 @@ use dwarfreader::{ create_section_reader, get_endian, is_dwo_dwarf, is_non_dwo_dwarf, is_raw_dwo_dwarf, }; -use gimli::{ - constants, AttributeValue::UnitRef, DebuggingInformationEntry, Dwarf, DwarfFileType, Reader, - Unit, -}; +use gimli::{constants, DebuggingInformationEntry, Dwarf, DwarfFileType, Reader, SectionId, Unit}; use log::LevelFilter; use std::ffi::CString; @@ -78,13 +75,14 @@ fn recover_names>( ) { if let Some(namespace_qualifier) = get_name(dwarf, unit, entry) { namespace_qualifiers.push((depth, namespace_qualifier)); - } else if let Ok(Some(UnitRef(offset))) = - entry.attr_value(constants::DW_AT_extension) + } else if let Some((entry_unit, entry_offset)) = + get_attr_die(dwarf, unit, entry, constants::DW_AT_extension) { + let entry = entry_unit.entry(entry_offset).unwrap(); resolve_namespace_name( dwarf, - unit, - &unit.entry(offset).unwrap(), + &entry_unit, + &entry, namespace_qualifiers, depth, ); @@ -172,7 +170,7 @@ fn parse_unit>( dwarf: &Dwarf, unit: &Unit, debug_info_builder: &mut DebugInfoBuilder, - progress: &Box Result<(), ()>>, + progress: &dyn Fn(usize, usize) -> Result<(), ()>, total_die_count: usize, ) { let mut entries = unit.entries(); -- cgit v1.3.1