1 个不稳定发布版
使用旧的 Rust 2015
0.1.0 | 2017 年 9 月 4 日 |
---|
#607 in 操作系统
用于 dlopen
3KB
rust-dlopen
概述
这个库是我努力使 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"
文档
许可证
本代码采用MIT许可证。
变更日志
感谢
特别感谢Simonas Kazlauskas,他的libloading成为了我的项目的基础。
lib.rs
:
一个可动态加载的库示例。
这个crate创建了一个动态库,可用于测试目的。它导出具有不同类型和abis的多个符号。其主要目的是在dynlib crate的测试中使用。
依赖关系
~43KB