应用程序二进制接口 (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 属性指定 函数静态 内容将放置到的目标文件的节。它使用 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() { }
}