Skip to content
rust elf parsing, manipulation and (re)linking toolkit
Branch: master
Clone or download
josephlr and aep Improve Strtab::insert
This code was crashing if Strtab::data began with a null byte
Latest commit e557bef May 14, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bin Upgrade dependencies Jul 7, 2018
bolter major refactor Nov 9, 2017
src Improve Strtab::insert May 22, 2019
tests we can fricking link elfkit with elfkit Dec 28, 2017
.gitignore Add .gitignore May 22, 2019
.travis.yml add now passing c++ test Dec 26, 2017
Cargo.toml prepare 0.0.06 Jul 21, 2018
LICENSE license Sep 8, 2017
NOTES.md first working link with full musl libc Oct 13, 2017
README.md Add syntax highlighting to README Jul 3, 2018

README.md

Build Status crates.io MIT licensed docs

Elfkit

An elf read and manipulation library in pure Rust (written from scratch, no bfd, no gnu code, no license infections), intended to be used in binary manipulation utils such as strip, chrpath, objcopy and ld. The end goal is to build a well designed library that facilitates all sorts of binary manipulation magic.

elfkit can now link elfkit, so it's reasonably complete for x86_64. But it's definitely not stable yet and might produce incorrect code.

Using the linker

The quickest way to use elfkit with Rust is with korhal/stasis.

You can also either build from source or download binaries. GCC does not have an option to use a foreign linker, so we need to pretend we're ld.gold, like so:

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

For using elfkit for compiling Rust code, add the following to ~/.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",
]

When compiling from source, create the ld.gold symlink manually:

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

Other binutils

readelf: screenshot

implementation status

binutils

type status gnu compatible
ldd done no
readelf done no
ld wip wip
objdump - -
ar - -
as - -
nm - -
strip - -

section parsers

type read write
symbols done done
strtab done done
relocations done done
dynamic done done
note - -
gnu_hash - -
hash - mvp
versym - -
verneed - -

architectures

abi parser linker
x86_64 done wip
mips32r2 o32 done
arm eabi done

modular linker toolkit

  • Loader: loads elf objects from disk
  • Linker: produces a link graph of sections from a loader
  • Collector: bakes multiple sections into a single object
  • Relocator: applies relocations to a combined object

alternatives

  • goblin mach-o and archive support, no-std support, very low level
  • elf most popular, most generic use case, no writing, no section parsing
  • xmas-elf zero alloc (good for writing an OS), read only

references

You can’t perform that action at this time.