You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Rustc不生成平凡公共函数代码的疑问及强制生成方法求助

Rustc不生成平凡公共函数代码的疑问及强制生成方法求助

我最近在调试Rust代码的时候遇到了一个有意思的编译器行为,想跟大家请教下。

我写了一个非常简单的公共函数,代码如下:

pub fn foo(v: &[i32], i: usize) -> i32 {
    unsafe { *v.get_unchecked(i) }
}

当我用优化模式(-O)把它编译成rlib库时,发现这个函数居然被编译成了几乎空的汇编代码,而且最终的库文件里完全找不到这个函数的符号。

先给大家看一下我的编译命令和对应的输出:
首先是编译生成汇编代码:

$ rustc --crate-type=rlib -O --emit=asm test.rs

生成的test.s内容如下,完全没有和foo相关的指令:

.file "test.4707fbd51808b46e-cgu.0"
.ident "rustc version 1.89.0-dev"
.section ".note.GNU-stack","",@progbits

然后我编译成rlib库文件,再检查里面的内容:

$ rustc --crate-type=rlib -O test.rs

用objdump查看库文件:

$ objdump -rd libtest.rlib
In archive libtest.rlib:
lib.rmeta:     file format elf64-x86-64
test.test.4707fbd51808b46e-cgu.0.rcgu.o:     file format elf64-x86-64

再用readelf查看符号表,结果里也完全找不到foo的影子:

$ readelf -sW libtest.rlib
File: libtest.rlib(lib.rmeta)
Symbol table '.symtab' contains 1 entry:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 

File: libtest.rlib(test.test.4707fbd51808b46e-cgu.0.rcgu.o)
Symbol table '.symtab' contains 2 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS test.4707fbd51808b46e-cgu.0

我自己的猜测是,这种逻辑极其“平凡”的函数(本质上就是直接做一个指针解引用),Rust编译器不会为它生成独立的机器码,但会把它的元信息记录在.rmeta文件里,方便其他依赖这个库的代码在编译时做内联优化?不过这只是我的猜测,想请大家帮我确认或者纠正这个想法,也希望能了解下这种行为的具体细节。

另外还有个实际的需求:有没有什么办法可以强制编译器为这类函数生成实际的汇编代码?我想看看它针对这个函数生成的具体指令是什么样的。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:19:31