diff options
| author | Josh Ferrell <josh@vector35.com> | 2024-08-15 22:48:59 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2024-08-16 16:29:37 -0400 |
| commit | de9584d8710144e352dbf09c5c2d1d46751d2f20 (patch) | |
| tree | 0173e78f0884bbe962c3da4f3f3c4be7a7755588 /rust/examples/dwarf/dwarf_import/src/helpers.rs | |
| parent | 086342aedfa97ff207d0c8e1993bf0ebff8a519a (diff) | |
Support for automatic loading of <filename>.debug and <filename>.dSYM
Diffstat (limited to 'rust/examples/dwarf/dwarf_import/src/helpers.rs')
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/helpers.rs | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/rust/examples/dwarf/dwarf_import/src/helpers.rs b/rust/examples/dwarf/dwarf_import/src/helpers.rs index 7127b2b8..691c5751 100644 --- a/rust/examples/dwarf/dwarf_import/src/helpers.rs +++ b/rust/examples/dwarf/dwarf_import/src/helpers.rs @@ -478,8 +478,14 @@ pub(crate) fn download_debug_info(build_id: &String, view: &BinaryView) -> Resul } -pub(crate) fn find_local_debug_file(build_id: &String, view: &BinaryView) -> Option<String> { +pub(crate) fn find_local_debug_file_for_build_id(build_id: &String, view: &BinaryView) -> Option<String> { let settings = Settings::new(""); + let debug_dirs_enabled = settings.get_bool("analysis.debugInfo.enableDebugDirectories", Some(view), None); + + if !debug_dirs_enabled { + return None; + } + let debug_info_paths = settings.get_string_list("analysis.debugInfo.debugDirectories", Some(view), None); if debug_info_paths.is_empty() { @@ -518,7 +524,7 @@ pub(crate) fn find_local_debug_file(build_id: &String, view: &BinaryView) -> Opt pub(crate) fn load_debug_info_for_build_id(build_id: &String, view: &BinaryView) -> (Option<Ref<BinaryView>>, bool) { - if let Some(debug_file_path) = find_local_debug_file(build_id, view) { + if let Some(debug_file_path) = find_local_debug_file_for_build_id(build_id, view) { return ( binaryninja::load_with_options( @@ -537,3 +543,53 @@ pub(crate) fn load_debug_info_for_build_id(build_id: &String, view: &BinaryView) } (None, false) } + + +pub(crate) fn find_sibling_debug_file(view: &BinaryView) -> Option<String> { + let settings = Settings::new(""); + let load_sibling_debug = settings.get_bool("analysis.debugInfo.loadSiblingDebugFiles", Some(view), None); + + if !load_sibling_debug { + return None; + } + + let filename = view.file().filename().to_string(); + + let debug_file = PathBuf::from(format!("{}.debug", filename)); + let dsym_folder = PathBuf::from(format!("{}.dSYM/", filename)); + if debug_file.exists() && debug_file.is_file() { + return Some(debug_file.to_string_lossy().to_string()); + } + + if dsym_folder.exists() && dsym_folder.is_dir() { + let dsym_file = dsym_folder + .join("Contents/Resources/DWARF/") + .join(filename); // TODO: should this just pull any file out? Can there be multiple files? + if dsym_file.exists() { + return Some(dsym_file.to_string_lossy().to_string()); + } + } + + None +} + + +pub(crate) fn load_sibling_debug_file(view: &BinaryView) -> (Option<Ref<BinaryView>>, bool) { + let Some(debug_file) = find_sibling_debug_file(view) else { + return (None, false); + }; + + let load_settings = match view.default_platform() { + Some(plat) => format!("{{\"analysis.debugInfo.internal\": false, \"loader.platform\": \"{}\"}}", plat.name()), + None => "{\"analysis.debugInfo.internal\": false}".to_string() + }; + + ( + binaryninja::load_with_options( + debug_file, + false, + Some(load_settings) + ), + false + ) +} |
