FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

プログラミング言語Rustに入門中 (goblinを使ってelfファイルを解析する3.)

f:id:msyksphinz:20171103203951p:plain

Rustのライブラリを使えばElfの解析だってできる。

バイナリファイルを読み込んで、HashMapにアドレスとデータの対を格納するプログラムを作成した。 各セクション毎にデータを読み込んで一つのHashMapにバイト単位でデータを書き込む。このモデルを作成すれば、Rustで簡単な命令セットシミュレータが作れるようになるはずだ。

  • training/program/rust/projects/sim_mem_elf/src/main.rs

github.com

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

f:id:msyksphinz:20171107012422p:plain

ただしまだRustとかScalaの初心者なので、MutableとかImmutableとか、まだ分かっていないことが多い。コンパイラの結果を見ながら進めている感じ。こんなので大丈夫かな?