我正在构建一个Rust crate作为静态库,并且希望在Rust级别导出所有公开可见的符号,以便它们在ELF文件中也可见,即具有GLOBAL绑定和DEFAULT可见性。
但是,某些符号显示为带有 HIDDEN 可见性的GLOBAL绑定,这意味着当我加载此静态库时,这些符号不可见。在带有GCC扩展的C中,您可以使用__attribute__((visibility("default")))
以每个符号为基础完成此操作,这很乏味但我想我的用例是可以的。我怎么能在Rust做到这一点?
这是一个代码示例,可以进一步说明我的问题。
在我的箱子lib.rs
中:
extern crate compiler_builtins;
// readelf shows these symbols as GLOBAL, HIDDEN, which is not what I want.
pub use compiler_builtins::float::conv::__floatundidf;
pub use compiler_builtins::int::mul::__muloti4;
pub use compiler_builtins::int::udiv::{__udivti3, __umodti3};
pub fn my_func() -> {...} // readelf shows this as GLOBAL, DEFAULT, which is good!
我正在构建一个静态库,因此所有符号都出现在ELF文件中(我没有使用--gc-sections
,因为我希望它们出现),只是导入的那些没有拥有适当的DEFAULT可见性。希望有一种方法可以强制它们在源级别(可能是注释或属性)具有DEFAULT可见性,但我无法找到它,所以我也接受链接器参数或脚本添加。