#dlopen #loading #symbols #macro #link #dynamic #derive

未维护 dlopen_derive

为 dlopen crate 提供衍生宏

5 个版本

使用旧的 Rust 2015

0.1.4 2019年6月9日
0.1.3 2018年7月17日
0.1.2 2018年5月9日
0.1.1 2017年9月5日
0.1.0 2017年9月4日

#14#dlopen

Download history 19433/week @ 2024-03-14 19823/week @ 2024-03-21 20178/week @ 2024-03-28 20247/week @ 2024-04-04 19971/week @ 2024-04-11 19602/week @ 2024-04-18 18552/week @ 2024-04-25 17676/week @ 2024-05-02 16625/week @ 2024-05-09 14937/week @ 2024-05-16 12899/week @ 2024-05-23 13976/week @ 2024-05-30 11551/week @ 2024-06-06 11994/week @ 2024-06-13 11819/week @ 2024-06-20 12283/week @ 2024-06-27

49,961 每月下载量
用于 220 个 crate (直接使用 18 个)

MIT 许可证

12KB
278

rust-dlopen

Travis CI Appveyor CI Crates CI Codedov CI Docs

概览

这个库是我努力让 Rust 中的动态链接库使用变得简单的成果。之前存在的解决方案要么不安全,要么需要编写大量代码才能完成简单的事情。我希望这个库能帮助您快速获得所需内容并避免错误。

快速示例

extern crate dlopen;
#[macro_use]
extern crate dlopen_derive;
use dlopen::wrapper::{Container, WrapperApi};

#[derive(WrapperApi)]
struct Api<'a> {
    example_rust_fun: fn(arg: i32) -> u32,
    example_c_fun: unsafe extern "C" fn(),
    example_reference: &'a mut i32,
}

fn main(){
    let mut cont: Container<Api> =
        unsafe { Container::load("libexample.so") }.expect("Could not open library or load symbols");
    cont.example_rust_fun(5);
    unsafe{cont.example_c_fun()};
    *cont.example_reference_mut() = 5;
}

特性

主要特性

  • 支持大多数平台,且平台无关。
  • 与 Rust 错误处理机制一致,使得出错变得更加困难。
  • 非常轻量级。它主要使用零成本包装器在平台 API 上创建更安全的抽象。
  • 线程安全。
  • 面向对象编程友好。
  • 提供低级 API,可提供使用库的完全灵活性。
  • 提供两个高级 API,可防止悬垂符号 - 每个都有其独特的方式。
  • 高级 API 支持将符号自动加载到结构中。您只需定义一个表示 API 的结构即可。其余的自动完成,只需编写少量代码。
  • 自动加载符号有助于您遵循 DRY 原则。

与其他库比较

特性 dlopen libloading sharedlib
基本功能
多平台
悬垂符号预防
线程安全 在较老的 Windows 平台上使用 SetErrorMode() 可能存在潜在问题 不支持 SetErrorMode (库可能在 Windows 上阻止应用程序)
将符号加载到结构中
开销 最小 最小 一些开销
低级、不安全的 API
面向对象友好
从程序本身加载
获取地址信息 (dladdr) 仅限 Unix

安全性

请注意,尽管Rust旨在成为100%安全的语言,但它尚未提供允许我创建100%安全库的机制,所以我只能接受99%。此外,动态链接库的本质需要将获取的指针转换为在应用程序端定义的类型。这无法保证安全。话虽如此,我仍然认为这个库提供了在Rust中可能的最佳方法和最大的安全性。

使用方法

Cargo.toml

[dependencies]
dlopen = "0.1"

文档

Cargo文档

许可协议

此代码遵照MIT许可协议。

变更日志

GitHub变更日志

致谢

特别感谢Simonas Kazlauskas,他的libloading成为了我的项目的代码基础。

依赖关系

~2MB
~47K SLoC