use object::Object; use std::{env, fs, process}; fn main() { let mut args = env::args().skip(1); if args.len() == 0 { eprintln!( "Usage: {} [address] ...", env::args().next().unwrap() ); process::exit(1); } let file_path = args.next().unwrap(); let file = match fs::File::open(&file_path) { Ok(file) => file, Err(err) => { println!("Failed to open file '{}': {}", file_path, err,); process::exit(1); } }; let file = match unsafe { memmap2::Mmap::map(&file) } { Ok(mmap) => mmap, Err(err) => { println!("Failed to map file '{}': {}", file_path, err,); process::exit(1); } }; let file = match object::File::parse(&*file) { Ok(file) => file, Err(err) => { println!("Failed to parse file '{}': {}", file_path, err); process::exit(1); } }; let map = file.object_map(); if args.len() == 0 { for symbol in map.symbols() { print_symbol(symbol, &map); } } else { for arg in args { let mut arg = &arg[..]; if arg.starts_with("0x") { arg = &arg[2..]; } let address = u64::from_str_radix(arg, 16).expect("Failed to parse address"); if let Some(symbol) = map.get(address) { print_symbol(symbol, &map); } else { println!("{:} not found", address); } } } } fn print_symbol(symbol: &object::ObjectMapEntry<'_>, map: &object::ObjectMap<'_>) { println!( "{:x} {:x} {} {}", symbol.address(), symbol.size(), String::from_utf8_lossy(symbol.name()), String::from_utf8_lossy(symbol.object(map)), ); }