Compiler Explorer似乎能够可靠地找到与功能相对应的汇编代码。假设使用x86_64-unknown-linux-gnu
工具链,常规(无属性)功能并且没有像cargo-asm
这样的额外工具,我该如何自己做呢?
我知道要生成程序集,可以使用rustc's --emit asm
flag。有人可能会认为,在.s文件中搜索函数的名称很容易,但是我发现并非如此。
例如,.s文件通常甚至没有提到函数名称,在这种情况下,向函数添加#[inline(never)]
会有所帮助。其次,找到带有函数名称的标签后,如何确定函数的结束位置?在我的测试箱中,我在更深处的.size
指令中第二次提到了函数名称-这是否标志着函数的结束?还是函数启动后的第一个retq
?
假设这个目标是可以实现的,我希望学习:
最佳答案
由于没有答案,因此我做了一些研究,这应该可以解决问题:
main()
使用该函数,如果是库条板箱,请确保由pub
函数使用(或者是pub
本身)。 #[inline(never)]
.type <mangled_name>,@function
<mangled_name>:
.cfi_startproc
.Lfunc_end<number>:
.size <mangled_name>, .Lfunc_end<number>-<mangled_name>
.cfi_endproc
有时可以在前面加上
retq
,但是不可靠。那些以点开头但不以冒号结尾的行(例如
.type
)是指令。 GNU汇编器可理解的指令已记录在here中,并且--emit asm
的输出应为GNU汇编器的有效输入。编译器资源管理器和
cargo-asm
似乎Compiler Explorer实际上保留了整个文件,并且不搜索功能,它只是过滤掉某些行。至少那是source code似乎正在做的事情。
cargo-asm
似乎专门用于寻找 .cfi_endproc
on Linux and Mac, and .seh_endproc
on Windows。
关于assembly - 如何在(发布的)Rust版本中找到函数的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62008744/