1 个不稳定版本
0.1.0 | 2022年2月28日 |
---|---|
0.0.1 |
|
#2583 in 解析器实现
84KB
2K SLoC
Zelf
一个针对 "no_std" 环境设计的零分配 ELF 解析器。
lib.rs
:
Zelf 是一个针对 "no_std" 环境设计的零分配 ELF 解析器。
它定义了 ELF C 结构体,并提供了解析函数和解析后的 Rust 类型。ELF C 结构体中的字段是字节数组,因此所有结构体都采用一字节对齐以避免错误的读取(在某些硬件上会导致故障)。
"context::Context" 是一个用于解析上下文的 trait,由 elf 头部中的标识唯一识别(32/64 位)、数据编码(小端/大端)、版本(当前为 1)。它决定了 ELF 结构体的布局(例如 "ProgramHeader","ArrayEntry")和解析后的 Rust 类型(例如 "Context::Integer","Context::SectionFlags","Context::DynamicFlags")。它们有四种组合,对应四种空类型 "Little32","Little64","Big32","Big64"。
您需要调用相应的解析函数来处理段和程序。这里有一个参考表格。
段/程序类型 | 解析函数 |
---|---|
Null, Probits, Nobits, Shlib, Load, Phdr, Tls | N/A |
Symtab, Dynsym | Symtab::parse |
Strtab, Rela, Hash, Dynamic, Note, Rel, Group, Interp | {type}::parse |
InitArray, FiniArray, PreinitArray | Array::parse |
SymtabShndx | Shndx::parse |
对于压缩段,您需要调用 "Compression::parse"。
您可以阅读 "examples/readelf" 以了解如何使用此 crate。
依赖项
~0.4–0.8MB
~19K SLoC