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 解析器实现
84KB
2K SLoC
pelf
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