@@ -44,6 +44,7 @@ use gimli::{
44
44
45
45
use binaryninja:: logger:: Logger ;
46
46
use helpers:: { get_build_id, load_debug_info_for_build_id} ;
47
+ use iset:: IntervalMap ;
47
48
use log:: { debug, error, warn} ;
48
49
49
50
trait ReaderType : Reader < Offset = usize > { }
@@ -512,6 +513,42 @@ fn get_supplementary_build_id(bv: &BinaryView) -> Option<String> {
512
513
}
513
514
}
514
515
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
+
515
552
fn parse_dwarf (
516
553
bv : & BinaryView ,
517
554
debug_bv : & BinaryView ,
@@ -563,40 +600,20 @@ fn parse_dwarf(
563
600
}
564
601
}
565
602
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 ( )
592
614
}
593
615
}
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
+ } ;
600
617
601
618
// Create debug info builder and recover name mapping first
602
619
// Since DWARF is stored as a tree with arbitrary implicit edges among leaves,
0 commit comments