#[macro_use]
extern crate json;
extern crate elf;
use std::path::PathBuf;
extern crate solana_rbpf;
use solana_rbpf::{
elf::Executable,
program::{BuiltinProgram, FunctionRegistry, SBPFVersion},
static_analysis::Analysis,
vm::TestContextObject,
};
use std::sync::Arc;
fn to_json(program: &[u8]) -> String {
let executable = Executable::<TestContextObject>::from_text_bytes(
program,
Arc::new(BuiltinProgram::new_mock()),
SBPFVersion::V2,
FunctionRegistry::default(),
)
.unwrap();
let analysis = Analysis::from_executable(&executable).unwrap();
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" => analysis.disassemble_instruction(
insn
),
));
}
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));
}