summaryrefslogtreecommitdiff
path: root/rust/examples/dwarf/dwarf_import/src/helpers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/examples/dwarf/dwarf_import/src/helpers.rs')
-rw-r--r--rust/examples/dwarf/dwarf_import/src/helpers.rs60
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
+ )
+}