关于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
相关产品推荐
相关产品推荐

