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
每月下载量54次
在binary-security-check中使用
140KB
1K SLoC
动态加载器共享库缓存的读取器
在某些操作系统中,加载可执行文件并为其执行准备所需的组件需要解析可执行文件所依赖的共享库(也称为动态链接库)。这些依赖通常只部分指定在可执行文件中。部分指定的库与库的完整路径之间的映射可能是一个昂贵的操作,因此通常会维护缓存以加快映射速度。
此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::Cache
、ld_elf_so_hints::Cache
、ld_so_1dot7::Cache
、ld_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.0
或glibc-ld.so.cache1.1
,字节序为小端或大端。 - OpenBSD/NetBSD:动态加载器缓存文件
/var/run/ld.so.hints
。
版本控制
此项目遵循 语义化版本控制。CHANGELOG.md
文件详细记录了随时间的变化。
依赖项
~1.3–2MB
~40K SLoC