Skip to content

Commit cf45899

Browse files
committed
Try to load eh_frame/debug_frame from both raw and normal views in dwarf import
1 parent 09afadc commit cf45899

File tree

1 file changed

+49
-32
lines changed
  • plugins/dwarf/dwarf_import/src

1 file changed

+49
-32
lines changed

plugins/dwarf/dwarf_import/src/lib.rs

+49-32
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ use gimli::{
4444

4545
use binaryninja::logger::Logger;
4646
use helpers::{get_build_id, load_debug_info_for_build_id};
47+
use iset::IntervalMap;
4748
use log::{debug, error, warn};
4849

4950
trait ReaderType: Reader<Offset = usize> {}
@@ -512,6 +513,42 @@ fn get_supplementary_build_id(bv: &BinaryView) -> Option<String> {
512513
}
513514
}
514515

516+
fn parse_range_data_offsets(bv: &BinaryView, dwo_file: bool) -> Option<Result<IntervalMap<u64, i64>, ()>> {
517+
if bv.section_by_name(".eh_frame").is_some() || bv.section_by_name("__eh_frame").is_some() {
518+
let eh_frame_endian = get_endian(bv);
519+
let eh_frame_section_reader = |section_id: SectionId| -> _ {
520+
create_section_reader(section_id, bv, eh_frame_endian, dwo_file)
521+
};
522+
let mut eh_frame = gimli::EhFrame::load(eh_frame_section_reader).unwrap();
523+
if let Some(view_arch) = bv.default_arch() {
524+
if view_arch.name().as_str() == "aarch64" {
525+
eh_frame.set_vendor(gimli::Vendor::AArch64);
526+
}
527+
}
528+
eh_frame.set_address_size(bv.address_size() as u8);
529+
Some(parse_unwind_section(bv, eh_frame)
530+
.map_err(|e| error!("Error parsing .eh_frame: {}", e)))
531+
} else if bv.section_by_name(".debug_frame").is_some()
532+
|| bv.section_by_name("__debug_frame").is_some()
533+
{
534+
let debug_frame_endian = get_endian(bv);
535+
let debug_frame_section_reader = |section_id: SectionId| -> _ {
536+
create_section_reader(section_id, bv, debug_frame_endian, dwo_file)
537+
};
538+
let mut debug_frame = gimli::DebugFrame::load(debug_frame_section_reader).unwrap();
539+
if let Some(view_arch) = bv.default_arch() {
540+
if view_arch.name().as_str() == "aarch64" {
541+
debug_frame.set_vendor(gimli::Vendor::AArch64);
542+
}
543+
}
544+
debug_frame.set_address_size(bv.address_size() as u8);
545+
Some(parse_unwind_section(bv, debug_frame)
546+
.map_err(|e| error!("Error parsing .debug_frame: {}", e)))
547+
} else {
548+
None
549+
}
550+
}
551+
515552
fn parse_dwarf(
516553
bv: &BinaryView,
517554
debug_bv: &BinaryView,
@@ -563,40 +600,20 @@ fn parse_dwarf(
563600
}
564601
}
565602

566-
let range_data_offsets;
567-
if bv.section_by_name(".eh_frame").is_some() || bv.section_by_name("__eh_frame").is_some() {
568-
let eh_frame_endian = get_endian(bv);
569-
let eh_frame_section_reader = |section_id: SectionId| -> _ {
570-
create_section_reader(section_id, bv, eh_frame_endian, dwo_file)
571-
};
572-
let mut eh_frame = gimli::EhFrame::load(eh_frame_section_reader).unwrap();
573-
if let Some(view_arch) = bv.default_arch() {
574-
if view_arch.name().as_str() == "aarch64" {
575-
eh_frame.set_vendor(gimli::Vendor::AArch64);
576-
}
577-
}
578-
eh_frame.set_address_size(bv.address_size() as u8);
579-
range_data_offsets = parse_unwind_section(bv, eh_frame)
580-
.map_err(|e| error!("Error parsing .eh_frame: {}", e))?;
581-
} else if bv.section_by_name(".debug_frame").is_some()
582-
|| bv.section_by_name("__debug_frame").is_some()
583-
{
584-
let debug_frame_endian = get_endian(bv);
585-
let debug_frame_section_reader = |section_id: SectionId| -> _ {
586-
create_section_reader(section_id, bv, debug_frame_endian, dwo_file)
587-
};
588-
let mut debug_frame = gimli::DebugFrame::load(debug_frame_section_reader).unwrap();
589-
if let Some(view_arch) = bv.default_arch() {
590-
if view_arch.name().as_str() == "aarch64" {
591-
debug_frame.set_vendor(gimli::Vendor::AArch64);
603+
let range_data_offsets = match parse_range_data_offsets(bv, dwo_file) {
604+
Some(x) => x?,
605+
None => {
606+
if let Some(raw_view) = bv.raw_view() {
607+
if let Some(offsets) = parse_range_data_offsets(&raw_view, dwo_file) {
608+
offsets?
609+
} else {
610+
Default::default()
611+
}
612+
} else {
613+
Default::default()
592614
}
593615
}
594-
debug_frame.set_address_size(bv.address_size() as u8);
595-
range_data_offsets = parse_unwind_section(bv, debug_frame)
596-
.map_err(|e| error!("Error parsing .debug_frame: {}", e))?;
597-
} else {
598-
range_data_offsets = Default::default();
599-
}
616+
};
600617

601618
// Create debug info builder and recover name mapping first
602619
// Since DWARF is stored as a tree with arbitrary implicit edges among leaves,

0 commit comments

Comments
 (0)