为什么在有和没有pub和#[no_mangle]的情况下生锈都会产生完全不同的装配?

时间:2019-04-04 14:24:56

标签: assembly rust rustc

有问题的锈代码为:

#[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之类的东西了吗?

1 个答案:

答案 0 :(得分:3)

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

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