use object::{Object, ObjectComdat, ObjectSection, ObjectSymbol}; use std::{env, fs, process}; fn main() { let arg_len = env::args().len(); if arg_len <= 1 { eprintln!("Usage: {} ...", env::args().next().unwrap()); process::exit(1); } for file_path in env::args().skip(1) { if arg_len > 2 { println!(); println!("{}:", file_path); } let file = match fs::File::open(&file_path) { Ok(file) => file, Err(err) => { println!("Failed to open file '{}': {}", file_path, err,); return; } }; let file = match unsafe { memmap::Mmap::map(&file) } { Ok(mmap) => mmap, Err(err) => { println!("Failed to map file '{}': {}", file_path, err,); return; } }; let file = match object::File::parse(&*file) { Ok(file) => file, Err(err) => { println!("Failed to parse file '{}': {}", file_path, err); return; } }; match file.mach_uuid() { Ok(Some(uuid)) => println!("Mach UUID: {:x?}", uuid), Ok(None) => {} Err(e) => println!("Failed to parse Mach UUID: {}", e), } match file.build_id() { Ok(Some(build_id)) => println!("Build ID: {:x?}", build_id), Ok(None) => {} Err(e) => println!("Failed to parse build ID: {}", e), } match file.gnu_debuglink() { Ok(Some((filename, crc))) => println!( "GNU debug link: {} CRC: {:08x}", String::from_utf8_lossy(filename), crc, ), Ok(None) => {} Err(e) => println!("Failed to parse GNU debug link: {}", e), } for segment in file.segments() { println!("{:?}", segment); } for section in file.sections() { println!("{}: {:?}", section.index().0, section); } for comdat in file.comdats() { print!("{:?} Sections:", comdat); for section in comdat.sections() { print!(" {}", section.0); } println!(); } for symbol in file.symbols() { println!("{}: {:?}", symbol.index().0, symbol); } for section in file.sections() { if section.relocations().next().is_some() { println!( "\n{} relocations", section.name().unwrap_or("") ); for relocation in section.relocations() { println!("{:?}", relocation); } } } } }