assembly 比terminal+objdump更好的方法来读取程序集?

qc6wkl3g  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(87)

例如,如果我在perf report中,我可以按回车键跟随一个分支。如果一个bin使用-g,一些源代码也会显示出来。
我不是真的需要源代码,但是如果我能跟随跳转的话会非常方便。我能做些什么来使阅读汇编更容易呢?因为我是在linux上,所以我最终运行perf并使用report来读这个

bzzcjhmw

bzzcjhmw1#

objdump -d --visualize-jumps=color很有意思,虽然在大的二进制文件中无法使用,因为它有很多行。在一个随机的较小的二进制文件中,我躺在周围(如果有人好奇的话,在32位模式下测试64位_原子变量的对齐;这个二进制文件来自clang):

    • 一米一米一**
...
 726:                e8 a5 fd ff ff             call   4d0 <pthread_create@plt>
 72b:                83 c4 10                   add    esp,0x10
 72e:                85 c0                      test   eax,eax
 730:      /-------- 75 62                      jne    794 <main+0xb4>
 732:   /--|-------> c5 f8 57 c0                vxorps xmm0,xmm0,xmm0
 736:   |  |         c5 fb 10 8e 48 e8 ff ff    vmovsd xmm1,QWORD PTR [esi-0x17b8]
 73e:   |  |         66 90                      xchg   ax,ax
 740:   |  |  /----> 31 c0                      xor    eax,eax
 742:   |  |  |      31 d2                      xor    edx,edx
 744:   |  |  |      31 c9                      xor    ecx,ecx
 746:   |  |  |      31 db                      xor    ebx,ebx
 748:   |  |  |      f0 0f c7 8e c0 00 00 00    lock cmpxchg8b QWORD PTR [esi+0xc0]
 750:   |  |  |      c5 f9 6e d0                vmovd  xmm2,eax
 754:   |  |  |      c4 e3 69 22 d2 01          vpinsrd xmm2,xmm2,edx,0x1
 75a:   |  |  |      c5 f9 2e d0                vucomisd xmm2,xmm0
 75e:   |  |  |  /-- 75 02                      jne    762 <main+0x82>
 760:   |  |  +--|-- 7b de                      jnp    740 <main+0x60>
 762:   |  |  |  \-> c5 f9 2e d1                vucomisd xmm2,xmm1
 766:   |  |  |  /-- 75 02                      jne    76a <main+0x8a>
 768:   |  |  \--|-- 7b d6                      jnp    740 <main+0x60>
 76a:   |  |     \-> 83 ec 04                   sub    esp,0x4

...

Agner Fog's objconv disassembler生成准备汇编的输出,包括分支目标上的标签,从而更容易找到循环的顶部。* 如何在Linux中反汇编二进制可执行文件以获得汇编代码?* 其他答案显示了objdump -d -S混合源代码和asm的示例。
还涉及:* How to remove "noise" from GCC/clang assembly output? * 我通常查看gcc -O3 ... -S的输出,而不是汇编成二进制文件。除非我已经有了一个特定的二进制文件。Godbolt compiler explorer有很好的工具来查找与源代码行相关的asm,比如循环体,大部分时间它的工作取决于编译器生成的调试信息。

相关问题