应用程序二进制接口 (ABI)
本节记录了影响包编译输出的 ABI 的特性。
有关指定导出函数的 ABI 的信息,请参阅外部函数。有关指定链接外部库的 ABI 的信息,请参阅外部块。
used
属性
used
属性只能应用于 static
项目。此 属性 强制编译器将变量保留在输出目标文件(.o、.rlib 等,最终二进制文件除外)中,即使该变量未被包中的任何其他项目使用或引用。但是,链接器仍然可以自由删除此类项目。
以下示例显示了编译器在什么条件下将 static
项目保留在输出目标文件中。
#![allow(unused)] fn main() { // foo.rs // This is kept because of `#[used]`: #[used] static FOO: u32 = 0; // This is removable because it is unused: #[allow(dead_code)] static BAR: u32 = 0; // This is kept because it is publicly reachable: pub static BAZ: u32 = 0; // This is kept because it is referenced by a public, reachable function: static QUUX: u32 = 0; pub fn quux() -> &'static u32 { &QUUX } // This is removable because it is referenced by a private, unused (dead) function: 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
属性指定 函数 或 静态 内容将放置到的目标文件的节。它使用 MetaNameValueStr 语法来指定节名称。
#![allow(unused)] fn main() { #[no_mangle] #[link_section = ".example_section"] pub static VAR1: u32 = 1; }
export_name
属性
export_name
属性指定将在 函数 或 静态 上导出的符号的名称。它使用 MetaNameValueStr 语法来指定符号名称。
#![allow(unused)] fn main() { #[export_name = "exported_symbol_name"] pub fn name_in_rust() { } }