2 个版本

0.1.1 2024年4月10日
0.1.0 2024年3月5日

#2142 in 解析器实现

Apache-2.0 OR MIT

2MB
35K SLoC

对象

object 包提供了一种跨平台的统一接口来处理对象文件。它支持读取可重定位对象文件和可执行文件,并写入 COFF/ELF/Mach-O/XCOFF 可重定位对象文件和 ELF/PE 可执行文件。

对于文件读取,它提供了多级支持

  • 适合零拷贝访问的原始结构定义
  • 用于访问原始结构的低级 API(《示例》)
  • 用于访问对象文件常见特征的更高级统一 API,例如部分和符号(《示例》)

支持的读取文件格式:ELF、Mach-O、Windows PE/COFF、Wasm、XCOFF 和 Unix 归档。

对于文件写入,它提供了

  • ELF、PE 和 COFF 的低级写入器
  • ELF 的高级构建器(《示例》)
  • 用于写入可重定位对象文件的统一 API(《示例》)

统一读取 API 的示例

use object::{Object, ObjectSection};
use std::error::Error;
use std::fs;

/// Reads a file and displays the name of each section.
fn main() -> Result<(), Box<dyn Error>> {
    let binary_data = fs::read("path/to/binary")?;
    let file = object::File::parse(&*binary_data)?;
    for section in file.sections() {
        println!("{}", section.name()?);
    }
    Ok(())
}

有关更多示例,请参阅《crates/examples》。

最低支持的 Rust 版本 (MSRV)

MSRV 的更改被认为是破坏性更改。我们对更改 MSRV 非常谨慎,但有时由于依赖关系需要更改。MSRV 是 1.65.0。

许可协议

许可协议为以下之一

根据您的要求。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中的贡献,应按照上述方式双许可,没有任何额外条款或条件。


lib.rs:

一个用于重写对象和可执行文件的库。

使用 Rewriter 结构体读取文件、修改它并将其写回。可以使用 Rewriter 结构体上的方法执行修改,或者通过将 Options 结构体传递给 Rewriter::modify 方法。

目前,仅支持 ELF 文件,并且尚不支持许多修改。

示例

use object_rewrite::{Options, Rewriter};

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let mut options = Options::default();
  options.delete_symbols.insert(b"main".to_vec());

  let input = std::fs::read("path/to/input")?;
  let mut rewriter = Rewriter::read(&input)?;
  rewriter.modify(options)?;
  let mut output = std::fs::File::create("path/to/output")?;
  rewriter.write(&mut output)?;
  Ok(())
}

依赖项