1 个不稳定版本

0.1.0 2022年2月28日
0.0.1 2022年2月27日

#2583 in 解析器实现

MIT 许可证

84KB
2K SLoC

Zelf

Crates.io Docs.rs

一个针对 "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