为什么 rust 会产生完全不同的程序集,有和没有 pub 和 #[no_mangle]?

  • 本文关键字:pub no mangle 程序集 rust assembly rust
  • 更新时间 :
  • 英文 :


有问题的 rust 代码是:

#[no_mangle]
fn add(a: isize, b: isize) -> isize {
a + b
}

当与 rustc 命令rustc add.rs --crate-type=lib --emit=asm -C opt-level=z一起使用时,它会生成以下汇编代码:

.text
.file   "add.3a1fbbbh-cgu.0"
.section    .text.add,"ax",@progbits
.globl  add
.type   add,@function
add:
.cfi_startproc
leaq    (%rdi,%rsi), %rax
retq
.Lfunc_end0:
.size   add, .Lfunc_end0-add
.cfi_endproc
.section    ".note.GNU-stack","",@progbits

和以下没有#[no_mangle]

.text
.file   "add.3a1fbbbh-cgu.0"
.section    ".note.GNU-stack","",@progbits

为什么会这样?难道不应该把add改成像_Zaddm这样没有杂乱无章的东西吗?

没有#[no_mangle],根本就没有发出代码(你看到的只是汇编指令,没有实际的代码)。我猜编译器决定该函数将始终是内联的,因此无需真正为其发出代码(特别是因为您正在优化大小并且内联添加两个值永远不会大于调用函数)。

你想要#[no_mangle]的唯一原因是如果你打算从 Rust 外部调用该函数。由于显而易见的原因,这样的调用无法内联,因此我假设编译器确实发出代码以使这些外部调用成为可能。

相关内容

最新更新