From 6a496b01b3e8a85c8231c949a306933e7ad58bfc Mon Sep 17 00:00:00 2001 From: Josh Ferrell Date: Thu, 18 Jul 2024 14:05:23 -0400 Subject: Support loading supplementary DWARF files --- rust/examples/dwarf/dwarf_import/src/functions.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'rust/examples/dwarf/dwarf_import/src/functions.rs') diff --git a/rust/examples/dwarf/dwarf_import/src/functions.rs b/rust/examples/dwarf/dwarf_import/src/functions.rs index f418a47f..ea6aba4d 100644 --- a/rust/examples/dwarf/dwarf_import/src/functions.rs +++ b/rust/examples/dwarf/dwarf_import/src/functions.rs @@ -15,15 +15,16 @@ use std::sync::OnceLock; use crate::dwarfdebuginfo::{DebugInfoBuilder, DebugInfoBuilderContext, TypeUID}; -use crate::helpers::*; +use crate::{helpers::*, ReaderType}; use crate::types::get_type; use binaryninja::templatesimplifier::simplify_str_to_str; use cpp_demangle::DemangleOptions; -use gimli::{constants, DebuggingInformationEntry, Reader, Unit}; +use gimli::{constants, DebuggingInformationEntry, Dwarf, Unit}; use regex::Regex; -fn get_parameters>( +fn get_parameters( + dwarf: &Dwarf, unit: &Unit, entry: &DebuggingInformationEntry, debug_info_builder_context: &DebugInfoBuilderContext, @@ -45,9 +46,10 @@ fn get_parameters>( constants::DW_TAG_formal_parameter => { //TODO: if the param type is a typedef to an anonymous struct (typedef struct {...} foo) then this is reoslved to an anonymous struct instead of foo // We should still recurse to make sure we load all types this param type depends on, but - let name = debug_info_builder_context.get_name(unit, child.entry()); + let name = debug_info_builder_context.get_name(dwarf, unit, child.entry()); let type_ = get_type( + dwarf, unit, child.entry(), debug_info_builder_context, @@ -70,17 +72,18 @@ fn get_parameters>( (result, variable_arguments) } -pub(crate) fn parse_function_entry>( +pub(crate) fn parse_function_entry( + dwarf: &Dwarf, unit: &Unit, entry: &DebuggingInformationEntry, debug_info_builder_context: &DebugInfoBuilderContext, debug_info_builder: &mut DebugInfoBuilder, ) -> Option { // Collect function properties (if they exist in this DIE) - let raw_name = get_raw_name(unit, entry, debug_info_builder_context); - let return_type = get_type(unit, entry, debug_info_builder_context, debug_info_builder); - let address = get_start_address(unit, entry, debug_info_builder_context); - let (parameters, variable_arguments) = get_parameters(unit, entry, debug_info_builder_context, debug_info_builder); + let raw_name = get_raw_name(dwarf, unit, entry); + let return_type = get_type(dwarf, unit, entry, debug_info_builder_context, debug_info_builder); + let address = get_start_address(dwarf, unit, entry); + let (parameters, variable_arguments) = get_parameters(dwarf, unit, entry, debug_info_builder_context, debug_info_builder); // If we have a raw name, it might be mangled, see if we can demangle it into full_name // raw_name should contain a superset of the info we have in full_name @@ -111,7 +114,7 @@ pub(crate) fn parse_function_entry>( // If we didn't demangle the raw name, fetch the name given if full_name.is_none() { - full_name = debug_info_builder_context.get_name(unit, entry) + full_name = debug_info_builder_context.get_name(dwarf, unit, entry) } debug_info_builder.insert_function(full_name, raw_name, return_type, address, ¶meters, variable_arguments) -- cgit v1.3.1