From 86dfc93b5e25b2bdfb3aec6741d587141e33e3eb Mon Sep 17 00:00:00 2001 From: Jaby Date: Mon, 24 Jul 2023 22:22:17 +0200 Subject: [PATCH] Print memory map --- src/Tools/readmap/src/dump/mod.rs | 32 ++++++++++++++++++++ src/Tools/readmap/src/lib.rs | 1 + src/Tools/readmap/src/main.rs | 50 ++++++++++++++++++------------- 3 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 src/Tools/readmap/src/dump/mod.rs diff --git a/src/Tools/readmap/src/dump/mod.rs b/src/Tools/readmap/src/dump/mod.rs new file mode 100644 index 00000000..c5bb163b --- /dev/null +++ b/src/Tools/readmap/src/dump/mod.rs @@ -0,0 +1,32 @@ +use super::Error; +use super::types::{MemoryMap, Symbol}; +use tool_helper::Output; + +pub fn write(mut out: Output, memory_map: &MemoryMap) -> Result { + const NAME_WIDTH:usize = 64; + fn print_symbols(out: &mut Output, symbols: &Vec) -> Result<(), Error> { + for symbol in symbols { + let mut name = symbol.name.as_str(); + + if name.len() > NAME_WIDTH { + writeln!(out, "\t{}", name)?; + name = " "; + } + + writeln!(out, "\t{::")?; + print_symbols(&mut out, &memory_map.global)?; + for section in &memory_map.sections { + let section_end = section.adr + section.size as u64; + + writeln!(out, "{}: @0x{:X} - 0x{:X}", section.name, section.adr, section_end)?; + print_symbols(&mut out, §ion.symbols)?; + } + + Ok(out) +} \ No newline at end of file diff --git a/src/Tools/readmap/src/lib.rs b/src/Tools/readmap/src/lib.rs index 17e7c1d7..4bf8b38e 100644 --- a/src/Tools/readmap/src/lib.rs +++ b/src/Tools/readmap/src/lib.rs @@ -1,4 +1,5 @@ pub mod types; +pub mod dump; use tool_helper::Error; use types::{MemoryMap, Section, Symbol}; diff --git a/src/Tools/readmap/src/main.rs b/src/Tools/readmap/src/main.rs index bbc3954d..8f121ac1 100644 --- a/src/Tools/readmap/src/main.rs +++ b/src/Tools/readmap/src/main.rs @@ -1,14 +1,31 @@ use clap::Parser; use tool_helper::{Error, exit_with_error}; +use readmap::types::MemoryMap; use std::{io::{BufRead, BufReader}, path::PathBuf, process::{Child, Command, Stdio}}; #[derive(Parser)] #[clap(about = "Opens and scans a MAP file to print extended information", long_about = None)] struct CommandLine { #[clap(value_parser, help="Input MAP file for scannning")] - input: PathBuf, + input: PathBuf, #[clap(long="wsl", default_value_t=false)] - use_wsl: bool, + use_wsl: bool, + #[clap(short='o')] + output: Option +} + +pub fn main() { + match CommandLine::try_parse() { + Ok(cmd_line) => { + match run_main(cmd_line) { + Ok(_) => (), + Err(error) => exit_with_error(error) + } + }, + Err(error) => { + println!("{}", error) + } + } } fn run_objdump(use_wsl: bool, input: PathBuf) -> Result { @@ -28,31 +45,24 @@ fn run_objdump(use_wsl: bool, input: PathBuf) -> Result { } fn run_main(cmd: CommandLine) -> Result<(), Error> { - let mut child = run_objdump(cmd.use_wsl, cmd.input)?; + let output = tool_helper::open_output(cmd.output)?; + let memory_map = generate_memory_map(cmd.use_wsl, cmd.input)?; + + readmap::dump::write(output, &memory_map)?; + Ok(()) +} + +fn generate_memory_map(use_wsl: bool, input: PathBuf) -> Result { + let mut child = run_objdump(use_wsl, input)?; if let Some(stdout) = &mut child.stdout { let mut line_iter = BufReader::new(stdout).lines().map(|l| l.unwrap()).into_iter(); readmap::scan(|| { line_iter.next() - })?; - Ok(()) + }) } else { Err(Error::from_str("Failed opening \"stdout\" for objdump")) - } + } } - -pub fn main() { - match CommandLine::try_parse() { - Ok(cmd_line) => { - match run_main(cmd_line) { - Ok(_) => (), - Err(error) => exit_with_error(error) - } - }, - Err(error) => { - println!("{}", error) - } - } -} \ No newline at end of file