在与 Rust 中的本机库链接时将符号公开给动态链接器

Posted

技术标签:

【中文标题】在与 Rust 中的本机库链接时将符号公开给动态链接器【英文标题】:Expose symbols to dynamic linker when linking with native library in Rust 【发布时间】:2015-12-04 07:00:04 【问题描述】:

我正在用 Rust 构建一个二进制可执行文件,它需要链接到一个本地库,比如 foo.afoo.a 包含一个符号 void bar(void),我想将它作为一个回调函数公开给动态链接器,该函数可以被 dlopen 风格的动态加载库中的函数调用。

如果我们使用C 源,这可以通过提供-rdynamicld 中完成。

gcc -rdynamic -o a_dynamic main.c foo.c

在 Rust 中这样做的正确方法是什么?我曾尝试在build.rs 中使用cargo:rustc-flags=-rdynamic,以及

#![feature(link_args)]
#[link_args = "-rdynamic"]

似乎都不起作用。

【问题讨论】:

只是一个疯狂的猜测 - 使用cargo:rustc-flags=-C link-args=-rdynamic。链接器的参数通过 rustc 中的-C link-args 选项传递。 @VladimirMatveev 试过了。没有运气。 【参考方案1】:

截至今天,Rust 工具链不鼓励将任意标志传递给链接器。我们可以做的最接近的正确方法是使用cargo rustc 并手动添加链接参数。

cargo rustc -- -C link-args='-rdynamic'

【讨论】:

以上是关于在与 Rust 中的本机库链接时将符号公开给动态链接器的主要内容,如果未能解决你的问题,请参考以下文章

如何在调试 MSVC ABI Rust 程序时检查变量值?

MT5211:本机链接失败,未定义的Objective-C类

静态库中的未定义符号链接到动态库

推迟共享库的链接

如何在不公开所有符号的情况下为 iOS 创建静态库

在 Xcode 中构建反应本机项目的问题 - 错误:找不到自动链接库 + 未定义符号等