Compiler Explorer似乎能够可靠地找到与功能相对应的汇编代码。假设有x86_64-unknown-linux-gnu
工具链,常规(无属性)功能并且没有cargo-asm
这样的额外工具,我该如何自己做?
我知道要生成程序集,我可以使用rustc's --emit asm
flag。可能有人认为,在.s文件中搜索函数的名称很容易,但是我发现不是。
例如,.s文件通常甚至没有提及函数名称,在这种情况下,在函数中添加--emit asm
会有所帮助。其次,找到带有函数名称的标签后,如何确定函数的结束位置?在我的测试箱中,我在更深的#[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
,但不可靠。
那些以点开头并以not结尾的行以冒号结尾,例如retq
,是指令。 GNU汇编器可理解的指令记录在.type
中,并且here的输出应为GNU汇编器的有效输入。
--emit asm
似乎Compiler Explorer实际上保留了整个文件,并且不搜索功能,它只是过滤掉某些行。至少这是cargo-asm
似乎正在做的事情。
[source code特别是在寻找cargo-asm
。