#elf #dlopen #so #ldso

无std dlopen-rs

用于从内存和文件中加载elf动态库的库

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 操作系统

Download history 90/week @ 2024-07-19 97/week @ 2024-07-26 209/week @ 2024-08-02 91/week @ 2024-08-09 153/week @ 2024-08-16

640 每月下载量

Apache-2.0

88KB
2K SLoC

license

dlopen-rs

dlopen-rs支持从内存和文件中加载动态库,支持no_std环境。它为您提供了更多的自由来加载和控制动态库,并为在no_std环境中使用动态库提供了可能的选项。它也与std环境中的系统动态链接器很好地协同工作。

目前支持x86_64x86RV64AArch64

特性

特性 默认 描述
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