@@ -44,6 +44,7 @@ use gimli::{
4444
4545use binaryninja:: logger:: Logger ;
4646use helpers:: { get_build_id, load_debug_info_for_build_id} ;
47+ use iset:: IntervalMap ;
4748use log:: { debug, error, warn} ;
4849
4950trait 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+
515552fn 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