Note
The API is documented here https://lief.re/doc/stable/rust/lief and the nightly doc is here: https://lief-rs.s3.fr-par.scw.cloud/doc/latest/lief/index.html.
[package]
name = "my-awesome-project"
version = "0.0.1"
edition = "2021"
[dependencies]
lief = { git = "https://github.com/lief-project/LIEF", branch = "main" }
Warning
LIEF rust bindings are not on docs.rs
because of network restrictions:
https://github.com/rust-lang/docs.rs/issues/2563
LIEF’s Rust bindings are split in two parts:
lief
: the high-level-rust-idiomatic API
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 cxx.rs).
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.
LIEF_RUST_PRECOMPILED
¶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:
/home/romain/out
├── lib
│ ├── libLIEF.a
│ └── liblief-sys.a
└── rs
└── autocxx-autocxx_ffi-gen.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:
Target |
Description |
---|---|
|
Regular Linux x86-64 (Ubuntu 19.10, Debian 10, …) |
|
Musl target that allows full static build |
|
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 |
The assets of the pre-compiled output are:
LIEF static library: LIEF.a, LIEF.lib
liefsys.{a, lib}
: C++ part of cxx.rs
autocxx-autocxx_ffi-gen.rs
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 autocxx-autocxx_ffi-gen.rs
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.