diff options
| author | KyleMiles <krm504@nyu.edu> | 2023-07-31 23:07:52 -0400 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2023-07-31 23:07:52 -0400 |
| commit | 877436a87570d49bd4c694f2a8b45d9a1f9be989 (patch) | |
| tree | 60d262921bc03e017d7092cb301b80f762cddef1 /rust/examples | |
| parent | 10d5bd9aed6122de4d096e78d116890e2ca439e0 (diff) | |
Dwarf import : Handle default address size for pointers better when the dwarf info doesn't specify it
Diffstat (limited to 'rust/examples')
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/die_handlers.rs | 19 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs | 9 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/lib.rs | 2 |
3 files changed, 27 insertions, 3 deletions
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<R: Reader<Offset = usize>>( )) } } 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<TypeUID, DebugType>, data_variables: HashMap<u64, (Option<CString>, TypeUID)>, names: HashMap<TypeUID, CString>, + 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 }; |
