@@ -374,37 +374,39 @@ where
374374{
375375 let mut bases = gimli:: BaseAddresses :: default ( ) ;
376376
377+ let view_start = view. start ( ) ;
378+
377379 if let Some ( section) = view
378380 . section_by_name ( ".eh_frame_hdr" )
379381 . or ( view. section_by_name ( "__eh_frame_hdr" ) )
380382 {
381- bases = bases. set_eh_frame_hdr ( section. start ( ) ) ;
383+ bases = bases. set_eh_frame_hdr ( section. start ( ) - view_start ) ;
382384 }
383385
384386 if let Some ( section) = view
385387 . section_by_name ( ".eh_frame" )
386388 . or ( view. section_by_name ( "__eh_frame" ) )
387389 {
388- bases = bases. set_eh_frame ( section. start ( ) ) ;
390+ bases = bases. set_eh_frame ( section. start ( ) - view_start ) ;
389391 } else if let Some ( section) = view
390392 . section_by_name ( ".debug_frame" )
391393 . or ( view. section_by_name ( "__debug_frame" ) )
392394 {
393- bases = bases. set_eh_frame ( section. start ( ) ) ;
395+ bases = bases. set_eh_frame ( section. start ( ) - view_start ) ;
394396 }
395397
396398 if let Some ( section) = view
397399 . section_by_name ( ".text" )
398400 . or ( view. section_by_name ( "__text" ) )
399401 {
400- bases = bases. set_text ( section. start ( ) ) ;
402+ bases = bases. set_text ( section. start ( ) - view_start ) ;
401403 }
402404
403405 if let Some ( section) = view
404406 . section_by_name ( ".got" )
405407 . or ( view. section_by_name ( "__got" ) )
406408 {
407- bases = bases. set_got ( section. start ( ) ) ;
409+ bases = bases. set_got ( section. start ( ) - view_start ) ;
408410 }
409411
410412 let mut cies = HashMap :: new ( ) ;
@@ -453,6 +455,19 @@ where
453455 register : _,
454456 offset,
455457 } => {
458+ //TODO: can we normalize this to be sp-based?
459+ /*
460+ Switching to RBP from RSP in this example breaks things, and we should know that RBP = RSP - 8
461+ 65 │ 0x1139: CFA=RSP+8: RIP=[CFA-8]
462+ 66 │ 0x113a: CFA=RSP+16: RBP=[CFA-16], RIP=[CFA-8]
463+ 67 │ 0x113d: CFA=RBP+16: RBP=[CFA-16], RIP=[CFA-8]
464+ 68 │ 0x1162: CFA=RSP+8: RBP=[CFA-16], RIP=[CFA-8]
465+
466+ can we
467+ know that CFA=RSP+8 at the beginning
468+ in the next instruction (66) we know RBP=[CFA-16]=[RSP-8]
469+ and do something with that?
470+ */
456471 // TODO: we should store offsets by register
457472 if row. start_address ( ) < row. end_address ( ) {
458473 cfa_offsets
@@ -498,7 +513,7 @@ fn get_supplementary_build_id(bv: &BinaryView) -> Option<String> {
498513}
499514
500515fn parse_dwarf (
501- _bv : & BinaryView ,
516+ bv : & BinaryView ,
502517 debug_bv : & BinaryView ,
503518 supplementary_bv : Option < & BinaryView > ,
504519 progress : Box < dyn Fn ( usize , usize ) -> Result < ( ) , ( ) > > ,
@@ -549,30 +564,35 @@ fn parse_dwarf(
549564 }
550565
551566 let range_data_offsets;
552- if view . section_by_name ( ".eh_frame" ) . is_some ( ) || view . section_by_name ( "__eh_frame" ) . is_some ( ) {
553- let eh_frame_endian = get_endian ( view ) ;
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 ) ;
554569 let eh_frame_section_reader = |section_id : SectionId | -> _ {
555- create_section_reader ( section_id, view , eh_frame_endian, dwo_file)
570+ create_section_reader ( section_id, bv , eh_frame_endian, dwo_file)
556571 } ;
557572 let mut eh_frame = gimli:: EhFrame :: load ( eh_frame_section_reader) . unwrap ( ) ;
558- if let Some ( view_arch) = view . default_arch ( ) {
573+ if let Some ( view_arch) = bv . default_arch ( ) {
559574 if view_arch. name ( ) . as_str ( ) == "aarch64" {
560575 eh_frame. set_vendor ( gimli:: Vendor :: AArch64 ) ;
561576 }
562577 }
563- eh_frame. set_address_size ( view . address_size ( ) as u8 ) ;
564- range_data_offsets = parse_unwind_section ( view , eh_frame)
578+ eh_frame. set_address_size ( bv . address_size ( ) as u8 ) ;
579+ range_data_offsets = parse_unwind_section ( bv , eh_frame)
565580 . map_err ( |e| error ! ( "Error parsing .eh_frame: {}" , e) ) ?;
566- } else if view . section_by_name ( ".debug_frame" ) . is_some ( )
567- || view . section_by_name ( "__debug_frame" ) . is_some ( )
581+ } else if bv . section_by_name ( ".debug_frame" ) . is_some ( )
582+ || bv . section_by_name ( "__debug_frame" ) . is_some ( )
568583 {
569- let debug_frame_endian = get_endian ( view ) ;
584+ let debug_frame_endian = get_endian ( bv ) ;
570585 let debug_frame_section_reader = |section_id : SectionId | -> _ {
571- create_section_reader ( section_id, view , debug_frame_endian, dwo_file)
586+ create_section_reader ( section_id, bv , debug_frame_endian, dwo_file)
572587 } ;
573588 let mut debug_frame = gimli:: DebugFrame :: load ( debug_frame_section_reader) . unwrap ( ) ;
574- debug_frame. set_address_size ( view. address_size ( ) as u8 ) ;
575- range_data_offsets = parse_unwind_section ( view, debug_frame)
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 ) ;
592+ }
593+ }
594+ debug_frame. set_address_size ( bv. address_size ( ) as u8 ) ;
595+ range_data_offsets = parse_unwind_section ( bv, debug_frame)
576596 . map_err ( |e| error ! ( "Error parsing .debug_frame: {}" , e) ) ?;
577597 } else {
578598 range_data_offsets = Default :: default ( ) ;
0 commit comments