Rustのライブラリを使えばElfの解析だってできる。
バイナリファイルを読み込んで、HashMapにアドレスとデータの対を格納するプログラムを作成した。 各セクション毎にデータを読み込んで一つのHashMapにバイト単位でデータを書き込む。このモデルを作成すれば、Rustで簡単な命令セットシミュレータが作れるようになるはずだ。
training/program/rust/projects/sim_mem_elf/src/main.rs
fn memory_elf (elf_obj: goblin::elf::Elf, memory: &mut std::collections::HashMap<u64, u8>, buffer: &std::vec::Vec<u8>) -> error::Result<()> { let shdr_strtab = &elf_obj.shdr_strtab; for section in &elf_obj.section_headers { println!("elf_obj.section_headers = {:#?}, file_offset = {:#x}, size = {:#x}", &shdr_strtab[section.sh_name], section.sh_offset, section.sh_size ); if section.sh_size != 0 { for idx in 0..(section.sh_size-1) { let mut offset = idx + section.sh_offset; memory.insert(section.sh_addr + idx, buffer[offset as usize]); } } } Ok(()) }
$ cargo run ~/work/rocket-chip-msyksphinz/riscv-tools/riscv-tests/benchmarks/qsort.riscv
ただしまだRustとかScalaの初心者なので、MutableとかImmutableとか、まだ分かっていないことが多い。コンパイラの結果を見ながら進めている感じ。こんなので大丈夫かな?