]> git.proxmox.com Git - rustc.git/blob - vendor/object/examples/objectmap.rs
New upstream version 1.57.0+dfsg1
[rustc.git] / vendor / object / examples / objectmap.rs
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 }