应用程序二进制接口 (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 属性 指定将 函数静态 内容放置到对象文件节。 使用 元名称值字符串 语法来指定节名称。

#![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() { }
}