2 releases

0.15.1 Jul 23, 2024
0.15.0 Jul 21, 2024
0.0.2 Apr 28, 2024
0.0.1 Jul 3, 2022

#305 in Parser implementations

Download history 197/week @ 2024-07-17 97/week @ 2024-07-24 24/week @ 2024-07-31 16/week @ 2024-08-07 5/week @ 2024-08-14 10/week @ 2024-08-21 6/week @ 2024-09-11 13/week @ 2024-09-18 33/week @ 2024-09-25 43/week @ 2024-10-02 22/week @ 2024-10-09

111 downloads per month

Apache-2.0

560KB
14K SLoC

LIEF Rust Bindings

These are the offical rust bindings for LIEF.

LIEF Architecture

Getting Started

[dependencies]
lief = "0.15.1"

The bindings require Rust edition 2021 and rustc >= 1.74.0

use lief;

if let Some(lief::Binary::ELF(elf)) = lief::Binary::from(&mut file) {
    println!("Dependencies:");
    for entry in elf.dynamic_entries() {
        if let dynamic::Entries::Library(lib) = entry {
            println!("  - {}", lib.name());
        }
    }
    println!("Versions:");
    for version in elf.symbols_version_requirement() {
        println!("  From {}", version.name());
        for aux in version.auxiliary_symbols() {
            println!("    - {}", aux.name());
        }
    }
}

lib.rs:

LIEF

LIEF Design

This package provides Rust bindings for LIEF. It exposes most of the LIEF API to read these formats:

  • ELF
  • PE
  • Mach-O

The bindings require at least Rust version 1.74.0 with the 2021 edition and support:

  • Windows x86-64 (support /MT and /MD linking)
  • Linux x86-64/aarch64 (Ubuntu 20.04, Almalinux 9, Debian 11.5, Fedora 29)
  • macOS (x86-64 and aarch64 with at least OSX Big Sur: 11.0)
  • iOS (aarch64)

Getting Started

[package]
name    = "my-awesome-project"
version = "0.0.1"
edition = "2021"

[dependencies]
# For nightly
lief = { git = "https://github.com/lief-project/LIEF", branch = "main" }
# For releases
lief = 0.15.0
fn main() {
   let path = std::env::args().last().unwrap();
   let mut file = std::fs::File::open(path).expect("Can't open the file");
   match lief::Binary::from(&mut file) {
       Some(lief::Binary::ELF(elf)) => {
           // Process ELF file
       },
       Some(lief::Binary::PE(pe)) => {
           // Process PE file
       },
       Some(lief::Binary::MachO(macho)) => {
           // Process Mach-O file (including FatMachO)
       },
       None => {
           // Parsing error
       }
   }
   return;
}

Note that the generic module implements the different traits shared by different structure of executable formats (symbols, relocations, ...)

Dependencies

~3–8MB
~152K SLoC