LIEF Rust bindings are still in a beta version and not published yet on Thus, you should specify LIEF as a dependency of your project using git or path while the binding are not officially released.

name    = "my-awesome-project"
version = "0.0.1"
edition = "2021"

lief = { git = "", branch = "main" }

The API is documented here: and the nightly documentation is available here:

Precompiled FFI Bindings

LIEF’s Rust bindings are split in two parts:

  1. lief: the high-level-rust-idiomatic API

  2. lief-ffi: the low-level FFI API generated by autocxx

It turns out that the lief-ffi package can take some time to be compiled (around 1 or 2 minutes) but most of this time is spent for compiling auto-generated C++ code (generated by

Similarly the .rs file generated by autocxx does not need to be regenerated every time. For a given tag or commit those files can be pre-compiled or pre-generated.

To avoid waiting on tasks that can be pre-computed, LIEF pre-compiles these elements and download them either from Github (for release) or a S3 bucket for nightly builds.


If one needs to avoid downloading these pre-compiled files, you can set LIEF_RUST_PRECOMPILED to point to the directory that contains these files:

├── lib
│   ├── libLIEF.a
│   └── liblief-sys.a
└── rs

3 directories, 3 files

LIEF_RUST_PRECOMPILED=/home/romain/out cargo build [...]

This variable can also be used while building with in offline mode (e.g. cargo --offline).

As of now, the following targets are supported with pre-compilation:




Regular Linux x86-64 (Ubuntu 20.04, Debian 11.5, …)


Linux aarch64 (Debian 12+)


macOS 11+ x86-64


macOS 11+ arm64 (Apple Silicon)


iOS 12+


Regular Windows x86-64 (static UCRT runtime)


Regular Windows x86-64 (dynamic UCRT runtime .dll)


The assets of the pre-compiled output are:

  1. LIEF static library: LIEF.a, LIEF.lib

  2. liefsys.{a, lib}: C++ part of

  3. bridge generated by autocxx.

LIEF static library must be compiled as described in the Compilation section using the CMake option: -DLIEF_RUST_API=ON.

liefsys.{a, lib} and can be generated using the lief-ffigen modules:

$ cd api/rust/cargo
$ cargo build --release -p lief-ffigen
$ ./target/release/lief-ffigen       \
   --output-dir ./out-gen            \
   --lief-dir <path-to-lief-sdk>     \
   --target x86_64-unknown-linux-gnu \
   --host x86_64-unknown-linux-gnu

--lief-dir must point to the install location of the SDK while out-gen/ contains the generated artifacts.