#[macro_use]
extern crate json;
extern crate elf;
use std::path::PathBuf;
extern crate solana_rbpf;
use solana_rbpf::{
disassembler::disassemble_instruction,
elf::Executable,
static_analysis::Analysis,
user_error::UserError,
vm::{Config, SyscallRegistry, TestInstructionMeter},
};
use std::collections::BTreeMap;
fn to_json(program: &[u8]) -> String {
let executable = Executable::<UserError, TestInstructionMeter>::from_text_bytes(
&program,
None,
Config::default(),
SyscallRegistry::default(),
BTreeMap::default(),
)
.unwrap();
let analysis = Analysis::from_executable(&executable);
let mut json_insns = vec![];
for insn in analysis.instructions.iter() {
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" => disassemble_instruction(&insn, &analysis),
));
}
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 = match elf::File::open_path(&path) {
Ok(f) => f,
Err(e) => panic!("Error: {:?}", e),
};
let text_scn = match file.get_section(".classifier") {
Some(s) => s,
None => panic!("Failed to look up .classifier section"),
};
let prog = &text_scn.data;
println!("{}", to_json(prog));
}