gpt4 book ai didi

rust - 如何从 Rust 可执行文件中导出符号?

转载 作者:行者123 更新时间:2023-11-29 07:48:31 27 4
gpt4 key购买 nike

我正在尝试从 Rust 可执行文件中导出一个符号:

#[allow(non_upper_case_globals)]
#[no_mangle]
pub static exported_symbol: [u8; 1] = *b"\0";

fn main() {
println!("Hello, world!");
}

exported_symbol 似乎没有被生成的二进制文件导出:

$ cargo build
$ nm ./target/debug/test_export| grep exported_symbol

另一方面,如果我使用相同的源构建一个库,则符号会被导出:

$ rustc --crate-type cdylib src/main.rs
$ nm libmain.so| grep exported_symbol
0000000000016c10 R exported_symbol

我在 Linux x86-64 上使用 Rust 1.18.0。

最佳答案

我建议在 .cargo/config 文件中使用这个而不是上面的:

[build]
rustflags = ["-C", "link-args=-rdynamic"]

-rdynamic 更便携。特别是,它适用于 Linux 和 MacOS。

此外,在当前的 Rust/LLVM 版本中,除非实际使用符号,否则链接器很可能会删除它。

为了避免这种情况,应该调用引用导出函数的虚拟函数(在任何时间点,例如在 main 函数中)。

此类函数的示例可能是:

pub fn init() {
let funcs: &[*const extern "C" fn()] = &[
exported_function_1 as _,
exported_function_2 as _,
exported_function_3 as _
];
std::mem::forget(funcs);
}

当然,导出的函数应该有 #[no_mangle] 属性:

#[no_mangle]
pub extern "C" fn exported_function_1() {
// ...
}

关于rust - 如何从 Rust 可执行文件中导出符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43712979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com