#elf #musl #dependencies #glibc #ldd #api-bindings

elb-dl

A library that resolves ELF dependencies without loading and executing them

5 unstable releases

new 0.3.2 Apr 19, 2025
0.3.1 Apr 16, 2025
0.3.0 Apr 11, 2025
0.2.0 Mar 31, 2025
0.1.0 Mar 30, 2025

#2 in #musl

Download history 240/week @ 2025-03-29 103/week @ 2025-04-05 170/week @ 2025-04-12

513 downloads per month
Used in elb-cli

MIT/Apache

210KB
5K SLoC

elb-dl

Crates.io Version Docs dependency status

A library that resolves ELF dependencies without loading and executing them.

Based on elb crate.

Examples

Resolve immediate dependencies

use elb_dl::{DependencyTree, DynamicLoader, Error, glibc};

fn resolve_immediate() -> Result<(), Error> {
    let loader = DynamicLoader::options()
        .search_dirs(glibc::get_search_dirs("/")?)
        .new_loader();
    let mut tree = DependencyTree::new();
    let deps = loader.resolve_dependencies("/bin/sh", &mut tree)?;
    for path in deps.iter() {
        eprintln!("{:?}", path);
    }
    Ok(())
}

Resolve dependencies recursively

use elb_dl::{DependencyTree, DynamicLoader, Error, glibc};
use std::collections::{BTreeSet, VecDeque};
use std::path::Path;

fn resolve_all() -> Result<(), Error> {
    let loader = DynamicLoader::options()
        .search_dirs(glibc::get_search_dirs("/")?)
        .new_loader();
    let mut tree = DependencyTree::new();
    let mut queue = VecDeque::new();
    queue.push_back(Path::new("/bin/sh").to_path_buf());
    while let Some(path) = queue.pop_front() {
        let deps = loader.resolve_dependencies(&path, &mut tree)?;
        queue.extend(deps);
    }
    // Print dependency table.
    for (dependent, dependencies) in tree.iter() {
        eprintln!("{dependent:?} => {dependencies:?}");
    }
    Ok(())
}

Dependencies

~0.5–1MB
~24K SLoC