【问题标题】:Does Rust have a dlopen equivalentRust 是否有 dlopen 等价物
【发布时间】:2014-03-17 17:41:57
【问题描述】:

Rust 有办法让程序可插入吗?在 C 中,我创建的插件是使用 dlopen 加载的 .so 文件。 Rust 是否提供了做同样事情的本机方式?

【问题讨论】:

    标签: plugins rust


    【解决方案1】:

    Rust FAQ 正式认可libloading。除此之外,我知道还有三种不同的选择:

    我没有尝试过任何这些,所以我不能真正说出哪个是最好的,或者不同变体的优缺点是什么。我强烈建议反对至少使用std::dynamic_lib,因为它已被弃用,并且可能在未来的某个时候被设为私有。

    【讨论】:

    • 是的,libloading 似乎是现在认可的做法。
    【解决方案2】:

    没错,

    以下是完整的用例示例:

    use std::unstable::dynamic_lib::DynamicLibrary;
    use std::os;
    
    fn load_cuda_library()
    {
    
        let path = Path::new("/usr/lib/libcuda.so");
    
        // Make sure the path contains a / or the linker will search for it.
        let path = os::make_absolute(&path);
    
        let lib = match DynamicLibrary::open(Some(&path)) {
            Ok(lib) => lib,
            Err(error) => fail!("Could not load the library: {}", error)
        };
    
        // load cuinit symbol
    
        let cuInit: extern fn(u32) -> u32 = unsafe {
            match lib.symbol("cuInit") {
                Err(error) => fail!("Could not load function cuInit: {}", error),
                Ok(cuInit) => cuInit
            }
        };
    
        let argument = 0;
        let expected_result = 0;
        let result = cuInit(argument);
    
        if result != expected_result {
            fail!("cuInit({:?}) != {:?} but equaled {:?}",
                    argument, expected_result, result)
        }
    }
    
    fn main()
    {
        load_cuda_library();
    }
    

    【讨论】:

    • 我假设这会加载任何与 C 兼容的库?而且我会假设像使用 dlopen 加载符号实际上并不知道函数签名,这意味着您无法确定您正在使用正确的参数调用函数。这似乎破坏了 Rust 为您提供的安全性,但我想随意加载其他代码不一定是最安全的事情。
    • 你说的很对。可以加载任何与 C 兼容的库。不幸的是,它破坏了安全性。但是,上述方案可能会发生变化。 Rust 开发人员将为动态加载库添加一种安全的方法,请参阅github.com/mozilla/rust/issues/458
    • 对于记录,issue #458 已经关闭,新的是github.com/rust-lang/rust/issues/15040
    • 再次被移动(因为它没有进入 Rust 的 1.0 版本):github.com/rust-lang/rfcs/issues/661
    • 我认为这不应该是@Matt 认可的答案,它建议在 Rust 中使用不稳定、不易访问的功能。 Rust 常见问题解答提供了与此不同的建议(有关更多详细信息,请参阅我对此问题的回答)。
    【解决方案3】:

    是的。有一个模块std::unstable::dynamic_lib 可以动态加载库。但是,它没有记录,因为它是一个高度实验性的 API(std::unstable 中的所有内容都没有记录)。正如@dbaupp 建议的那样,the source 是最好的文档(当前版本是af9368452)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2011-01-16
    • 2020-09-20
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多