From 877436a87570d49bd4c694f2a8b45d9a1f9be989 Mon Sep 17 00:00:00 2001 From: KyleMiles Date: Mon, 31 Jul 2023 23:07:52 -0400 Subject: Dwarf import : Handle default address size for pointers better when the dwarf info doesn't specify it --- rust/examples/dwarf/dwarf_import/src/die_handlers.rs | 19 ++++++++++++++++++- .../examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs | 9 ++++++++- rust/examples/dwarf/dwarf_import/src/lib.rs | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) (limited to 'rust/examples') diff --git a/rust/examples/dwarf/dwarf_import/src/die_handlers.rs b/rust/examples/dwarf/dwarf_import/src/die_handlers.rs index bc7624b3..5563b2a5 100644 --- a/rust/examples/dwarf/dwarf_import/src/die_handlers.rs +++ b/rust/examples/dwarf/dwarf_import/src/die_handlers.rs @@ -200,7 +200,24 @@ pub fn handle_pointer>( )) } } else { - None + if let Some(entry_type_offset) = entry_type { + let parent_type = debug_info_builder.get_type(entry_type_offset).unwrap().1; + Some(Type::pointer_of_width( + parent_type.as_ref(), + debug_info_builder.default_address_size(), + false, + false, + Some(reference_type), + )) + } else { + Some(Type::pointer_of_width( + Type::void().as_ref(), + debug_info_builder.default_address_size(), + false, + false, + Some(reference_type), + )) + } } } diff --git a/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs b/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs index f82174aa..aa359232 100644 --- a/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs +++ b/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs @@ -15,6 +15,7 @@ use crate::helpers::{get_uid, resolve_specification}; use binaryninja::{ + binaryview::{BinaryView, BinaryViewBase}, debuginfo::{DebugFunctionInfo, DebugInfo}, rc::*, templatesimplifier::simplify_str_to_str, @@ -100,18 +101,24 @@ pub struct DebugInfoBuilder { types: HashMap, data_variables: HashMap, TypeUID)>, names: HashMap, + default_address_size: usize, } impl DebugInfoBuilder { - pub fn new() -> Self { + pub fn new(view: &BinaryView) -> Self { DebugInfoBuilder { functions: vec![], types: HashMap::new(), data_variables: HashMap::new(), names: HashMap::new(), + default_address_size: view.address_size(), } } + pub fn default_address_size(&self) -> usize { + self.default_address_size + } + #[allow(clippy::too_many_arguments)] pub fn insert_function( &mut self, diff --git a/rust/examples/dwarf/dwarf_import/src/lib.rs b/rust/examples/dwarf/dwarf_import/src/lib.rs index e568753e..f7c29269 100644 --- a/rust/examples/dwarf/dwarf_import/src/lib.rs +++ b/rust/examples/dwarf/dwarf_import/src/lib.rs @@ -228,7 +228,7 @@ fn parse_dwarf( // Since DWARF is stored as a tree with arbitrary implicit edges among leaves, // it is not possible to correctly track namespaces while you're parsing "in order" without backtracking, // so we just do it up front - let mut debug_info_builder = DebugInfoBuilder::new(); + let mut debug_info_builder = DebugInfoBuilder::new(view); if (*progress)(0, 1).is_err() { return debug_info_builder; // Parsing canceled }; -- cgit v1.3.1