]>
Commit | Line | Data |
---|---|---|
17df50a5 XL |
1 | use object::Object; |
2 | use std::{env, fs, process}; | |
3 | ||
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 { memmap2::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 | ||
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 | } |