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