#elf #ld #linker #pure #parser #link #read

bin+lib elfkit

一个纯Rust编写的ELF解析和操作库

7 个版本

使用旧的Rust 2015

0.0.7 2019年5月25日
0.0.6 2018年7月21日
0.0.4 2017年10月13日
0.0.3 2017年9月27日

#6 in #ld

Download history 52/week @ 2024-03-11 30/week @ 2024-03-18 4/week @ 2024-03-25 78/week @ 2024-04-01 26/week @ 2024-04-08 105/week @ 2024-04-15 35/week @ 2024-04-22 21/week @ 2024-04-29 8/week @ 2024-05-06 24/week @ 2024-05-13 32/week @ 2024-05-20 15/week @ 2024-05-27 22/week @ 2024-06-03 16/week @ 2024-06-10 10/week @ 2024-06-17 11/week @ 2024-06-24

61 每月下载量
用于 12 个crate(2 个直接使用)

MIT/ApacheGPL-2.0 许可协议

6MB
5.5K SLoC

包含(静态库,2.5MB)999-libmusl.a,(静态库,2.5MB)tests/linker/c-common/zzz-libmusl.a,(静态库,2.5MB)tests/linker/c-init-array/999-libmusl.a,(静态库,2.5MB)tests/linker/c-simple/999-libmusl.a,(静态库,2.5MB)998-libmusl.a,(静态库,2.5MB)999-libmusl.a 和更多

Build Status MIT licensed docs

Elfkit

一个纯Rust编写的ELF读取和操作库(从头开始编写,没有bfd,没有gnu代码,没有许可证感染),旨在用于strip、chrpath、objcopy和ld等二进制操作工具。最终目标是构建一个设计良好的库,以方便各种二进制操作魔法。

现在Elfkit可以链接Elfkit,所以在x86_64上已经相当完整。但肯定还不稳定,可能会生成错误的代码。

使用链接器

使用Rust快速使用elfkit的方法是使用korhal/stasis

您也可以从源代码构建或下载二进制文件。GCC没有使用外国链接器的选项,因此我们需要假装我们是ld.gold,如下所示

curl -L https://github.com/aep/elfkit/releases/download/0.0.4/elfkit-0.0.4.tar.xz | tar xvjf -
export PATH="$PWD/elfkit-0.0.4/:$PATH"
musl-gcc -fuse-ld=gold main.c

要使用elfkit编译Rust代码,请将以下内容添加到~/.cargo/config

[target.x86_64-unknown-linux-musl]
rustflags = [
    "-C", "link-arg=-fuse-ld=gold",
    "-C", "link-arg=-Wl,-dynamic-linker,/usr/local/musl/lib/libc.so",
]

从源代码编译时,请手动创建ld.gold符号链接

cargo build --release --bin ld
ln -s "$PWD/target/release/ld" /usr/local/bin/ld.gold

其他binutils

readelf: 屏幕截图

实现状态

binutils

类型 状态 GNU兼容
ldd 完成
readelf 完成
ld 进行中 进行中
objdump - -
ar - -
as - -
nm - -
strip - -

部分解析器

类型 读取 写入
符号 完成 完成
strtab 完成 完成
重定位 完成 完成
动态 完成 完成
note - -
gnu_hash - -
hash - mvp
versym - -
verneed - -

架构

abi 解析器 链接器
x86_64 完成 进行中
mips32r2 o32 完成
arm eabi 完成

模块化链接工具包

  • 加载器:从磁盘加载ELF对象
  • 链接器:从加载器生成部分链接图
  • 收集器:将多个部分烘焙成单个对象
  • 重定位器:将重定位应用于组合对象

替代方案

  • goblin mach-o和归档支持,无标准支持,非常底层
  • elf 最受欢迎,最通用的使用场景,无写入,无部分解析
  • xmas-elf 零分配(适合编写操作系统),只读

参考

依赖项

~11–21MB
~300K SLoC