#shared #dylib #dll #so #api-wrapper

dlopen

用于打开和操作动态链接库(也称为共享对象或共享库)的库。这是对现有库(如libloading或sharedlib)的现代且更灵活的替代方案。

9个版本

使用旧的Rust 2015

0.1.8 2019年8月16日
0.1.7 2019年6月9日
0.1.6 2018年12月28日
0.1.5 2018年7月17日
0.1.2 2017年9月6日

#156 in 操作系统

Download history 19409/week @ 2024-03-14 19748/week @ 2024-03-21 19848/week @ 2024-03-28 20141/week @ 2024-04-04 19914/week @ 2024-04-11 19579/week @ 2024-04-18 18538/week @ 2024-04-25 17673/week @ 2024-05-02 16634/week @ 2024-05-09 14930/week @ 2024-05-16 12893/week @ 2024-05-23 13977/week @ 2024-05-30 11533/week @ 2024-06-06 11966/week @ 2024-06-13 11799/week @ 2024-06-20 12264/week @ 2024-06-27

49,878 每月下载量
218 个crate(31直接)中使用

MIT 许可证

79KB
1K SLoC

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支持自动将符号加载到结构体中。您只需要定义一个表示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
约48K SLoC