Skip to content

Commit e63edea

Browse files
committed
Load eh_frame/debug_frame from base bv instead of debug bv and make calculated cie offset ranges relative to bv start
1 parent 1521d8f commit e63edea

File tree

1 file changed

+38
-18
lines changed
  • plugins/dwarf/dwarf_import/src

1 file changed

+38
-18
lines changed

plugins/dwarf/dwarf_import/src/lib.rs

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

500515
fn 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

Comments
 (0)