例如,如果我在perf report中,我可以按回车键跟随一个分支。如果一个bin使用-g,一些源代码也会显示出来。我不是真的需要源代码,但是如果我能跟随跳转的话会非常方便。我能做些什么来使阅读汇编更容易呢?因为我是在linux上,所以我最终运行perf并使用report来读这个
perf report
-g
bzzcjhmw1#
objdump -d --visualize-jumps=color很有意思,虽然在大的二进制文件中无法使用,因为它有很多行。在一个随机的较小的二进制文件中,我躺在周围(如果有人好奇的话,在32位模式下测试64位_原子变量的对齐;这个二进制文件来自clang):
objdump -d --visualize-jumps=color
... 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,比如循环体,大部分时间它的工作取决于编译器生成的调试信息。
objconv
objdump -d -S
gcc -O3 ... -S
1条答案
按热度按时间bzzcjhmw1#
objdump -d --visualize-jumps=color
很有意思,虽然在大的二进制文件中无法使用,因为它有很多行。在一个随机的较小的二进制文件中,我躺在周围(如果有人好奇的话,在32位模式下测试64位_原子变量的对齐;这个二进制文件来自clang):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,比如循环体,大部分时间它的工作取决于编译器生成的调试信息。