5个版本
新 0.2.1 | 2024年8月20日 |
---|---|
0.2.0 | 2024年8月15日 |
0.1.2 | 2024年8月4日 |
0.1.1 | 2024年8月4日 |
0.1.0 | 2024年7月25日 |
#167 in 操作系统
640 每月下载量
88KB
2K SLoC
dlopen-rs
dlopen-rs支持从内存和文件中加载动态库,支持no_std
环境。它为您提供了更多的自由来加载和控制动态库,并为在no_std
环境中使用动态库提供了可能的选项。它也与std
环境中的系统动态链接器很好地协同工作。
目前支持x86_64
、x86
、RV64
和AArch64
。
特性
特性 | 默认 | 描述 |
---|---|---|
ldso | 是 | 允许使用系统动态加载器(ldso )加载动态库 |
std | 是 | 启用std |
mmap | 是 | 在支持mmap 的平台启用此选项 |
tls | 是 | 需要使用thread local storage 时启用此选项 |
nightly | 否 | 启用此选项可以使加载更快,但您需要使用nightly 编译器 |
unwinding | 否 | 想要使用dlopen-rs提供的异常处理机制时启用此选项 |
libgcc | 是 | 程序使用libgcc 处理异常时启用此选项 |
libunwind | 否 | 程序使用libunwind 处理异常时启用此选项 |
示例
use dlopen_rs::ELFLibrary;
use std::path::Path;
fn main() {
let path = Path::new("./target/release/libexample.so");
let libc = ELFLibrary::ldso_load("libc.so.6").unwrap();
let libgcc = ELFLibrary::ldso_load("libgcc_s.so.1").unwrap();
let libexample = ELFLibrary::from_file(path)
.unwrap()
.relocate(&[libgcc, libc])
.unwrap();
let f = unsafe {
libexample
.get::<extern "C" fn(i32) -> i32>("c_fun_add_two")
.unwrap()
};
println!("{}", f(2));
let f = unsafe {
libexample
.get::<extern "C" fn()>("c_fun_print_something_else")
.unwrap()
};
f();
}
注意
目前不支持使用gdb/lldb调试加载的动态库
依赖项
~2.2–4MB
~71K SLoC