#[macro_use]
extern crate json;
extern crate elf;
use elf::endian::AnyEndian;
use elf::ElfBytes;
use std::path::PathBuf;
extern crate rbpf;
use rbpf::disassembler;
fn to_json(prog: &[u8]) -> String {
let insns = disassembler::to_insn_vec(prog);
let mut json_insns = vec![];
for insn in insns {
json_insns.push(object!(
"opc" => format!("{:#x}", insn.opc), "dst" => format!("{:#x}", insn.dst), "src" => format!("{:#x}", insn.src), "off" => format!("{:#x}", insn.off), "imm" => format!("{:#x}", insn.imm as i32), "desc" => insn.desc
));
}
json::stringify_pretty(
object!(
"size" => json_insns.len(),
"insns" => json_insns
),
4,
)
}
fn main() {
let filename = "examples/load_elf__block_a_port.o";
let path = PathBuf::from(filename);
let file_data = std::fs::read(path).expect("Could not read file");
let slice = file_data.as_slice();
let file = ElfBytes::<AnyEndian>::minimal_parse(slice).expect("Fail to parse ELF file");
let classifier_section_header = match file.section_header_by_name(".classifier") {
Ok(Some(header)) => header,
Ok(None) => panic!("No .classifier section found"),
Err(e) => panic!("Error while searching for .classifier section: {}", e),
};
let prog = file
.section_data(&classifier_section_header)
.expect("Failed to get .classifier section data").0;
println!("{}", to_json(prog));
}