use goblin::elf::Elf;
use std::fs::File;
use std::io::{self, Read};
use std::path::Path;
pub struct Binary {
elf: Elf<'static>,
}
impl Binary {
pub fn parse(path: &Path) -> io::Result<Self> {
let mut file = File::open(path)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
let buffer = Box::leak(buffer.into_boxed_slice());
let elf = Elf::parse(buffer).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
Ok(Binary { elf })
}
pub fn symbols(&self) -> Vec<String> {
self.elf.syms.iter().map(|sym| {
self.elf.strtab.get_at(sym.st_name).unwrap_or("").to_string()
}).collect()
}
pub fn resolve_got_plt(&self) -> Vec<(String, u64)> {
self.elf.dynsyms.iter().filter_map(|sym| {
self.elf.dynstrtab.get_at(sym.st_name).map(|name| {
(name.to_string(), sym.st_value)
})
}).collect()
}
}