Skip to content

Commit

Permalink
Merge pull request #410 from philipc/dwarfdump-bases
Browse files Browse the repository at this point in the history
dwarfdump: set eh_frame base addresses
  • Loading branch information
philipc committed Mar 16, 2019
2 parents 28f75db + f10fb6d commit e177597
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions examples/dwarfdump.rs
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,25 @@ where

let mut eh_frame = gimli::EhFrame::load(&mut load_section).unwrap();
eh_frame.set_address_size(address_size);
dump_eh_frame(&mut BufWriter::new(out.lock()), &eh_frame, &register_name)?;
let mut bases = gimli::BaseAddresses::default();
if let Some(section) = file.section_by_name(".eh_frame_hdr") {
bases = bases.set_eh_frame_hdr(section.address());
}
if let Some(section) = file.section_by_name(".eh_frame") {
bases = bases.set_eh_frame(section.address());
}
if let Some(section) = file.section_by_name(".text") {
bases = bases.set_text(section.address());
}
if let Some(section) = file.section_by_name(".got") {
bases = bases.set_got(section.address());
}
dump_eh_frame(
&mut BufWriter::new(out.lock()),
&eh_frame,
&bases,
&register_name,
)?;
}
if flags.info {
dump_info(&dwarf, flags)?;
Expand Down Expand Up @@ -559,6 +577,7 @@ where
fn dump_eh_frame<R: Reader, W: Write>(
w: &mut W,
eh_frame: &gimli::EhFrame<R>,
bases: &gimli::BaseAddresses,
register_name: &Fn(gimli::Register) -> Cow<'static, str>,
) -> Result<()> {
// TODO: Print "__eh_frame" here on macOS, and more generally use the
Expand All @@ -569,17 +588,9 @@ fn dump_eh_frame<R: Reader, W: Write>(
"Exception handling frame information for section .eh_frame"
)?;

// TODO: when grabbing section contents in `dump_file`, we should also grab
// these addresses.
let bases = gimli::BaseAddresses::default()
.set_eh_frame_hdr(0)
.set_eh_frame(0)
.set_text(0)
.set_got(0);

let mut cies = HashMap::new();

let mut entries = eh_frame.entries(&bases);
let mut entries = eh_frame.entries(bases);
loop {
match entries.next()? {
None => return Ok(()),
Expand All @@ -594,7 +605,7 @@ fn dump_eh_frame<R: Reader, W: Write>(
writeln!(w, " data_align: {}", cie.data_alignment_factor())?;
writeln!(w, " ra_register: {:#x}", cie.return_address_register().0)?;
// TODO: aug_arg
dump_cfi_instructions(w, cie.instructions(eh_frame, &bases), true, register_name)?;
dump_cfi_instructions(w, cie.instructions(eh_frame, bases), true, register_name)?;
writeln!(w)?;
}
Some(gimli::CieOrFde::Fde(partial)) => {
Expand All @@ -621,7 +632,7 @@ fn dump_eh_frame<R: Reader, W: Write>(
if let Some(gimli::Pointer::Direct(lsda)) = fde.lsda() {
writeln!(w, " lsda: {:#018x}", lsda)?;
}
dump_cfi_instructions(w, fde.instructions(eh_frame, &bases), false, register_name)?;
dump_cfi_instructions(w, fde.instructions(eh_frame, bases), false, register_name)?;
writeln!(w)?;
}
}
Expand Down

0 comments on commit e177597

Please sign in to comment.