Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

应用程序二进制接口 (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 属性使用 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 属性。