From f10fb6d7614bee712686cbbbd391756c7958a56d Mon Sep 17 00:00:00 2001 From: Philip Craig Date: Fri, 15 Mar 2019 19:42:35 +1000 Subject: [PATCH] dwarfdump: set eh_frame base addresses --- examples/dwarfdump.rs | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/examples/dwarfdump.rs b/examples/dwarfdump.rs index 92b2fe2f5..b9d0b822b 100644 --- a/examples/dwarfdump.rs +++ b/examples/dwarfdump.rs @@ -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, ®ister_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, + ®ister_name, + )?; } if flags.info { dump_info(&dwarf, flags)?; @@ -559,6 +577,7 @@ where fn dump_eh_frame( w: &mut W, eh_frame: &gimli::EhFrame, + bases: &gimli::BaseAddresses, register_name: &Fn(gimli::Register) -> Cow<'static, str>, ) -> Result<()> { // TODO: Print "__eh_frame" here on macOS, and more generally use the @@ -569,17 +588,9 @@ fn dump_eh_frame( "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(()), @@ -594,7 +605,7 @@ fn dump_eh_frame( 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)) => { @@ -621,7 +632,7 @@ fn dump_eh_frame( 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)?; } }