summaryrefslogtreecommitdiff
path: root/rust/examples
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2023-07-31 23:07:52 -0400
committerKyleMiles <krm504@nyu.edu>2023-07-31 23:07:52 -0400
commit877436a87570d49bd4c694f2a8b45d9a1f9be989 (patch)
tree60d262921bc03e017d7092cb301b80f762cddef1 /rust/examples
parent10d5bd9aed6122de4d096e78d116890e2ca439e0 (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.rs19
-rw-r--r--rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs9
-rw-r--r--rust/examples/dwarf/dwarf_import/src/lib.rs2
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
};