如何在(发布的)Rust版本中找到我的函数的汇编代码?

问题描述 投票:0回答:1

Compiler Explorer似乎能够可靠地找到与功能相对应的汇编代码。假设有x86_64-unknown-linux-gnu工具链,常规(无属性)功能并且没有cargo-asm这样的额外工具,我该如何自己做?

我知道要生成程序集,我可以使用rustc's --emit asm flag。可能有人认为,在.s文件中搜索函数的名称很容易,但是我发现不是。

例如,.s文件通常甚至没有提及函数名称,在这种情况下,在函数中添加--emit asm会有所帮助。其次,找到带有函数名称的标签后,如何确定函数的结束位置?在我的测试箱中,我在更深的#[inline(never)]指令中第二次提到了函数名称-这是否标志着函数的结束?还是功能启动后的第一个.size

假设这个目标是可以实现的,我希望学习:

  • 查找函数开始和结束的最可靠方法是什么?
  • 获得合适的程序集文件以执行此操作的先决条件是什么?
assembly rust x86-64 compiler-explorer
1个回答
0
投票

由于没有答案,我做了一些研究,这应该可以解决问题:

  1. [如果使用二进制板条箱,请确保该函数由retq使用,如果使用库板条箱,则应确保该函数由main()函数使用(或者本身为pub
  2. 为了避免编译器插入基准,请将其标记为pub
  3. 搜索函数名称,应该找到开始,看起来像这样:
#[inline(never)]
  1. 搜索功能的结尾,用以下标记:
    .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

© www.soinside.com 2019 - 2024. All rights reserved.