应用程序二进制接口 (ABI)
本节记录的特性,影响 crate 编译输出的 ABI 。
有关指定导出函数的 ABI 的信息,请参阅 外部函数 。 有关指定链接外部库的 ABI 的信息,请参阅 外部块 。
used
属性
used
属性 仅适用于 static
条目 。
此 属性 强制编译器将变量保留在输出对象文件 (.o .rlib 等,不包括最终二进制文件) 中,
即使该变量没有被 crate 中的其他条目使用或引用。
但是,链接器仍然可以删除这样的条目。
下面的例子,展示了编译器在什么条件下保留一个 static
条目到输出对象文件中。
#![allow(unused)] fn main() { // foo.rs // 因为 `#[used]` 而保留: #[used] static FOO: u32 = 0; // 因为未使用而可移除: #[allow(dead_code)] static BAR: u32 = 0; // 因为可以被公开访问而保留: pub static BAZ: u32 = 0; // 因为被公开可访问的函数所引用而保留: static QUUX: u32 = 0; pub fn quux() -> &'static u32 { &QUUX } // 因为被私有未使用的函数所引用而可移除: static CORGE: u32 = 0; #[allow(dead_code)] fn corge() -> &'static u32 { &CORGE } }
$ rustc -O --emit=obj --crate-type=rlib foo.rs
$ nm -C foo.o
0000000000000000 R foo::BAZ
0000000000000000 r foo::FOO
0000000000000000 R foo::QUUX
0000000000000000 T foo::quux
no_mangle
属性
no_mangle
属性 可以用于任何 条目 ,以禁用标准符号名称编码。该条目的符号将是该条目名称的标识符。
此外,该条目将从生成的库或对象文件中公开导出,类似于 used
属性 。
link_section
属性
link_section
属性 指定将 函数 或 静态 内容放置到对象文件节。
使用 元名称值字符串 语法来指定节名称。
#![allow(unused)] fn main() { #[no_mangle] #[link_section = ".example_section"] pub static VAR1: u32 = 1; }
export_name
属性
export_name
属性 指定将在 函数 或 静态 上导出的符号名称。
使用 元名称值字符串 语法来指定符号名称。
#![allow(unused)] fn main() { #[export_name = "exported_symbol_name"] pub fn name_in_rust() { } }