5 个版本

0.1.5 2023年4月24日
0.1.4 2023年4月24日
0.1.3 2023年4月20日
0.1.2 2023年4月19日
0.1.1 2023年4月18日

#1394 in 解析器实现

MIT 许可证

84KB
2K SLoC

pelf

pelf at crates.io pelf at docs.rs

A Rust-native library for parsing/generating ELF.

入门

以下是一个解析elf文件并显示其头部属性的示例。

fn main() {
    let args: Vec<String> = args().collect();
    if args.len() != 2 {
        panic!("usage: demo <elf-filepath>")
    }

    let mut f = File::open(&args[1]).expect("failed to open elf-file");

    let mut buf = Vec::with_capacity(4096);
    let _ = f.read_to_end(&mut buf).expect("failed to read elf-file");

    let parser = pelf::parser::ElfParserConfig::new().build();
    let elf = parser
        .parse_elf_file(&buf)
        .expect("failed to parse elf-file");

    match elf {
        pelf::file::ElfFile::Elf64(elf64) => {
            dump_elf64_file(elf64);
        }
        _ => unimplemented!(),
    }
}

fn dump_elf64_file(elf: pelf::file::Elf64File) {
    dump_elf64_header(&elf.header);
}

fn dump_elf64_header(header: &pelf::header::Elf64Header) {
    println!("ELF Header:");
    println!("    Class: {}", header.ident.class);
    println!("    Data: {}", header.ident.data);
    println!("    File Version: {}(Current)", header.ident.version);
    println!("    Type: {}", header.elf_type);
    println!("    Machine: {}", header.machine);
    println!("    Version: 0x{:x}", header.version);
    println!("    Entry: 0x{:x}", header.entry);
    println!("    PHT Offset: 0x{:x}", header.phoff);
    println!("    SHT Offset: 0x{:x}", header.shoff);
    // println!("    Flags: 0b{:b}", header.e_flags);
    println!("    PHT Entry Size: 0x{:x}", header.phentsize);
    println!("    PHT Entries: {}", header.phnum);
    println!("    SHT Entry Size: 0x{:x}", header.shentsize);
    println!("    SHT Entries: {}", header.shnum);
    println!("    Section Header String Table Index: {}", header.shstrndx);
}

特性

  • 64位ELF对象文件。
  • 解析器
    • ELF头部
    • 节头部表
    • 节(数据)
    • 程序头部表
    • 符号表
    • 动态信息表
    • 重定位信息表

运行示例

其他示例位于 这里.

# parser example
$ cargo run --example demo /usr/bin/ls

依赖项

~1.1–1.8MB
~38K SLoC