From d142c9d6ba104bdbbe7b90fb77e3070bb2e67709 Mon Sep 17 00:00:00 2001 From: sewer56 Date: Thu, 7 Dec 2023 14:00:57 +0000 Subject: [PATCH] Added: Switch for Little Endian DWARF Dump --- src/cmd/dwarf.rs | 10 ++++++++++ src/util/dwarf.rs | 40 ++++++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/cmd/dwarf.rs b/src/cmd/dwarf.rs index 46552c8..61ee26d 100644 --- a/src/cmd/dwarf.rs +++ b/src/cmd/dwarf.rs @@ -20,6 +20,8 @@ use crate::util::{ }, file::{buf_writer, map_file}, }; +use crate::util::dwarf::ENDIAN; +use crate::util::reader::Endian; #[derive(FromArgs, PartialEq, Debug)] /// Commands for processing DWARF 1.1 information. @@ -48,6 +50,9 @@ pub struct DumpArgs { #[argp(switch)] /// Disable color output. no_color: bool, + /// Whether to use Little Endian for DWARF parsing. + #[argp(switch)] + little_endian: bool, } pub fn run(args: Args) -> Result<()> { @@ -66,6 +71,11 @@ fn dump(args: DumpArgs) -> Result<()> { let theme = theme_set.themes.get("Solarized (dark)").context("Failed to load theme")?; let syntax = syntax_set.find_syntax_by_name("C++").context("Failed to find syntax")?.clone(); + // Set Endian + if args.little_endian { + unsafe { ENDIAN = Endian::Little }; + } + let file = map_file(&args.in_file)?; let buf = file.as_slice(); if buf.starts_with(b"!\n") { diff --git a/src/util/dwarf.rs b/src/util/dwarf.rs index 977803b..1359e6d 100644 --- a/src/util/dwarf.rs +++ b/src/util/dwarf.rs @@ -17,7 +17,11 @@ use crate::{ }; use super::reader; -pub const ENDIAN: reader::Endian = Endian::Big; +pub static mut ENDIAN: reader::Endian = Endian::Big; + +pub fn get_endian() -> reader::Endian { + unsafe { ENDIAN } +} #[derive(Debug, Eq, PartialEq, Copy, Clone, IntoPrimitive, TryFromPrimitive)] #[repr(u16)] @@ -476,14 +480,14 @@ where R: BufRead + Seek + ?Sized { break; } - let size = u32::from_reader(reader, ENDIAN)?; - let version = u8::from_reader(reader, ENDIAN)?; + let size = u32::from_reader(reader, get_endian())?; + let version = u8::from_reader(reader, get_endian())?; ensure!(version == 1, "Expected version 1, got {version}"); - let _debug_offs = u32::from_reader(reader, ENDIAN)?; - let _debug_size = u32::from_reader(reader, ENDIAN)?; + let _debug_offs = u32::from_reader(reader, get_endian())?; + let _debug_size = u32::from_reader(reader, get_endian())?; while reader.stream_position()? < position + size as u64 { - let _address = u32::from_reader(reader, ENDIAN)?; - let _length = u32::from_reader(reader, ENDIAN)?; + let _address = u32::from_reader(reader, get_endian())?; + let _length = u32::from_reader(reader, get_endian())?; } } Ok(()) @@ -492,7 +496,7 @@ where R: BufRead + Seek + ?Sized { fn read_tag(reader: &mut R) -> Result where R: BufRead + Seek + ?Sized { let position = reader.stream_position()?; - let size = u32::from_reader(reader, ENDIAN)?; + let size = u32::from_reader(reader, get_endian())?; if size < 8 { // Null entry if size > 4 { @@ -501,7 +505,7 @@ where R: BufRead + Seek + ?Sized { return Ok(Tag { key: position as u32, kind: TagKind::Padding, attributes: vec![] }); } - let tag_num = u16::from_reader(reader, ENDIAN)?; + let tag_num = u16::from_reader(reader, get_endian())?; let tag = TagKind::try_from(tag_num).context("Unknown DWARF tag type")?; let mut attributes = Vec::new(); if tag == TagKind::Padding { @@ -532,27 +536,27 @@ where R: BufRead + ?Sized { fn read_attribute(reader: &mut R) -> Result where R: BufRead + Seek + ?Sized { - let attr_type = u16::from_reader(reader, ENDIAN)?; + let attr_type = u16::from_reader(reader, get_endian())?; let attr = AttributeKind::try_from(attr_type).context("Unknown DWARF attribute type")?; let form = FormKind::try_from(attr_type & FORM_MASK).context("Unknown DWARF form type")?; let value = match form { - FormKind::Addr => AttributeValue::Address(u32::from_reader(reader, ENDIAN)?), - FormKind::Ref => AttributeValue::Reference(u32::from_reader(reader, ENDIAN)?), + FormKind::Addr => AttributeValue::Address(u32::from_reader(reader, get_endian())?), + FormKind::Ref => AttributeValue::Reference(u32::from_reader(reader, get_endian())?), FormKind::Block2 => { - let size = u16::from_reader(reader, ENDIAN)?; + let size = u16::from_reader(reader, get_endian())?; let mut data = vec![0u8; size as usize]; reader.read_exact(&mut data)?; AttributeValue::Block(data) } FormKind::Block4 => { - let size = u32::from_reader(reader, ENDIAN)?; + let size = u32::from_reader(reader, get_endian())?; let mut data = vec![0u8; size as usize]; reader.read_exact(&mut data)?; AttributeValue::Block(data) } - FormKind::Data2 => AttributeValue::Data2(u16::from_reader(reader, ENDIAN)?), - FormKind::Data4 => AttributeValue::Data4(u32::from_reader(reader, ENDIAN)?), - FormKind::Data8 => AttributeValue::Data8(u64::from_reader(reader, ENDIAN)?), + FormKind::Data2 => AttributeValue::Data2(u16::from_reader(reader, get_endian())?), + FormKind::Data4 => AttributeValue::Data4(u32::from_reader(reader, get_endian())?), + FormKind::Data8 => AttributeValue::Data8(u64::from_reader(reader, get_endian())?), FormKind::String => AttributeValue::String(read_string(reader)?), }; Ok(Attribute { kind: attr, value }) @@ -1724,7 +1728,7 @@ fn process_enumeration_tag(tags: &TagMap, tag: &Tag) -> Result (AttributeKind::ElementList, AttributeValue::Block(data)) => { let mut cursor = Cursor::new(data); while cursor.position() < data.len() as u64 { - let value = i32::from_reader(&mut cursor, ENDIAN)?; + let value = i32::from_reader(&mut cursor, get_endian())?; let name = read_string(&mut cursor)?; members.push(EnumerationMember { name, value }); }