4个版本

0.2.0 2024年4月24日
0.1.2 2024年3月27日
0.1.1 2024年3月13日
0.1.0 2024年2月25日

缓存类别中排名第66

Download history 171/week @ 2024-04-15 162/week @ 2024-04-22 21/week @ 2024-04-29 6/week @ 2024-05-13 25/week @ 2024-05-20 1/week @ 2024-05-27 5/week @ 2024-06-03 13/week @ 2024-06-10 4/week @ 2024-06-17 4/week @ 2024-06-24 25/week @ 2024-07-01 3/week @ 2024-07-08 10/week @ 2024-07-15 12/week @ 2024-07-22 29/week @ 2024-07-29

每月下载量54
binary-security-check中使用

MIT许可证

140KB
1K SLoC

crates.io docs.rs license

动态加载器共享库缓存的读取器

在某些操作系统中,加载可执行文件并为其执行准备所需的组件需要解析可执行文件所依赖的共享库(也称为动态链接库)。这些依赖通常只部分指定在可执行文件中。部分指定的库与库的完整路径之间的映射可能是一个昂贵的操作,因此通常会维护缓存以加快映射速度。

此crate提供了对这些缓存的只读访问权限,允许将部分指定的库名解析为库文件的完整路径。例如,查询库名libc.so.6可能会返回一系列可能的库路径列表

  • /usr/lib/x86_64-linux-gnu/libc.so.6
  • /usr/lib/i386-linux-gnu/libc.so.6
use dynamic_loader_cache::{Cache, Result};

fn main() -> Result<()> {
    let cache = Cache::load()?;
    let libc_iter = cache
        .iter()?
        // Ignore entries with errors.
        .filter_map(Result::ok)
        // Select entries for "libc.so.6".
        .filter_map(|entry| (*entry.file_name == *"libc.so.6").then_some(entry.full_path));

    for full_path in libc_iter {
        println!("{}", full_path.display());
    }
    Ok(())
}

该crate提供了一个简单的接口,但它从系统上支持的所有缓存中提取和聚合信息。以下是一个使用此接口的示例

use dynamic_loader_cache::{Cache, Result};

fn main() -> Result<()> {
    let cache = Cache::load()?;

    for entry in cache.iter()? {
        let entry = entry?;
        println!("{} => {}", entry.file_name.to_str().unwrap(), entry.full_path.display());
    }
    Ok(())
}

该crate还允许加载特定的动态加载器缓存,而不是自动发现和聚合所有支持和存在的缓存。为此,请查看以下结构:glibc_ld_so_cache_1dot1::Cacheld_elf_so_hints::Cacheld_so_1dot7::Cacheld_so_hints::Cache

支持的操作系统

以下是目前支持的操作系统的列表

  • FreeBSD:动态加载器缓存文件 /var/run/ld-elf.so.hints/var/run/ld-elf32.so.hints
  • GNU/Linux:动态加载器缓存文件 /etc/ld.so.cache,格式为 ld.so-1.7.0glibc-ld.so.cache1.1,字节序为小端或大端。
  • OpenBSD/NetBSD:动态加载器缓存文件 /var/run/ld.so.hints

版本控制

此项目遵循 语义化版本控制CHANGELOG.md 文件详细记录了随时间的变化。

依赖项

~1.3–2MB
~40K SLoC