应用程序二进制接口 (ABI)
本节记录影响 crate 编译输出的 ABI 的功能。
有关指定导出函数的 ABI 的信息,请参阅*[外部函数]。有关指定链接外部库的 ABI 的信息,请参阅[外部块]*。
used 属性
*used [属性]*强制静态保留在输出目标文件(.o、.rlib 等,不包括最终二进制文件)中,即使它从未被 crate 中的任何其他项使用或引用。但是,链接器仍然可以自由地移除它。
Example
#![allow(unused)] fn main() { // lib.rs // This is kept because of `#[used]`. #[used] static S1: u8 = 0; // This is removable because it's unused. #[allow(dead_code)] static S2: u8 = 0; // This is kept because it's publicly reachable. pub static S3: u8 = 0; // This is kept because it's referenced by a publicly // reachable function. static S4: u8 = 0; #[unsafe(no_mangle)] pub fn f4() -> &'static u8 { &S4 } // This is removable because it's referenced only by a // private, unused (dead) function. static S5: u8 = 0; #[allow(dead_code)] fn f5() -> &'static u8 { &S5 } }$ rustc -O --emit=obj --crate-type=rlib lib.rs $ LC_ALL=C nm -C lib.o 0000000000000000 R lib::S1 0000000000000000 R lib::S3 0000000000000000 r lib::S4 0000000000000000 T f4
used 属性使用 MetaWord 语法。
used 属性只能应用于 [static 项]。
只有项上的第一次使用 used 才有效果。
Note
rustc会对第一次之后的任何使用发出 lint 警告。
no_mangle 属性
no_mangle 属性可用于任何项以禁用标准符号名称修饰。该项的符号将是该项名称的标识符。
此外,该项将从生成的库或目标文件中公开导出,类似于 used 属性。
此属性是不安全的,因为未修饰的符号可能与同名的另一个符号(或知名符号)冲突,导致未定义行为。
#![allow(unused)]
fn main() {
#[unsafe(no_mangle)]
extern "C" fn foo() {}
}
2024 Edition differences
在 2024 版本之前,允许使用不带
unsafe限定的no_mangle属性。
link_section 属性
link_section 属性指定函数或静态的内容将被放入的目标文件部分。
link_section 属性使用 MetaNameValueStr 语法指定部分名称。
#![allow(unused)]
fn main() {
#[cfg(target_os = "linux")] {
#[unsafe(no_mangle)]
#[unsafe(link_section = ".example_section")]
pub static VAR1: u32 = 1;
}
}
此属性是不安全的,因为它允许用户将数据和代码放入不期望它们的内存部分,例如将可变数据放入只读区域。
只有项上的第一次使用 link_section 才有效果。
Note
rustc会对第一次之后的任何使用发出带有未来兼容性警告的 lint 警告。这可能在未来成为错误。
2024 Edition differences
在 2024 版本之前,允许使用不带
unsafe限定的link_section属性。
export_name 属性
export_name 属性指定将在函数或静态上导出的符号名称。
export_name 属性使用 MetaNameValueStr 语法指定符号名称。
#![allow(unused)]
fn main() {
#[unsafe(export_name = "exported_symbol_name")]
pub fn name_in_rust() { }
}
此属性是不安全的,因为具有自定义名称的符号可能与同名的另一个符号(或知名符号)冲突,导致未定义行为。
只有项上的第一次使用 export_name 才有效果。
Note
rustc会对第一次之后的任何使用发出带有未来兼容性警告的 lint 警告。这可能在未来成为错误。
2024 Edition differences
在 2024 版本之前,允许使用不带
unsafe限定的export_name属性。