1 use object::Object;
2 use std::{env, fs, process};
3 
main()4 fn main() {
5     let mut args = env::args().skip(1);
6     if args.len() == 0 {
7         eprintln!(
8             "Usage: {} <file> [address] ...",
9             env::args().next().unwrap()
10         );
11         process::exit(1);
12     }
13 
14     let file_path = args.next().unwrap();
15     let file = match fs::File::open(&file_path) {
16         Ok(file) => file,
17         Err(err) => {
18             println!("Failed to open file '{}': {}", file_path, err,);
19             process::exit(1);
20         }
21     };
22     let file = match unsafe { memmap::Mmap::map(&file) } {
23         Ok(mmap) => mmap,
24         Err(err) => {
25             println!("Failed to map file '{}': {}", file_path, err,);
26             process::exit(1);
27         }
28     };
29     let file = match object::File::parse(&*file) {
30         Ok(file) => file,
31         Err(err) => {
32             println!("Failed to parse file '{}': {}", file_path, err);
33             process::exit(1);
34         }
35     };
36 
37     let map = file.object_map();
38 
39     if args.len() == 0 {
40         for symbol in map.symbols() {
41             print_symbol(symbol, &map);
42         }
43     } else {
44         for arg in args {
45             let mut arg = &arg[..];
46             if arg.starts_with("0x") {
47                 arg = &arg[2..];
48             }
49             let address = u64::from_str_radix(arg, 16).expect("Failed to parse address");
50             if let Some(symbol) = map.get(address) {
51                 print_symbol(symbol, &map);
52             } else {
53                 println!("{:} not found", address);
54             }
55         }
56     }
57 }
58 
print_symbol(symbol: &object::ObjectMapEntry<'_>, map: &object::ObjectMap<'_>)59 fn print_symbol(symbol: &object::ObjectMapEntry<'_>, map: &object::ObjectMap<'_>) {
60     println!(
61         "{:x} {:x} {} {}",
62         symbol.address(),
63         symbol.size(),
64         String::from_utf8_lossy(symbol.name()),
65         String::from_utf8_lossy(symbol.object(map)),
66     );
67 }
68