此答案特定于x86。可拆卸AArch64,MIPS或任何包含objdump和的机器代码的便携式工具llvm-objdump。
昂纳雾的反汇编器,objconv是相当不错的。它将在反汇编输出中添加有关性能问题的注释(例如,具有16位立即数的指令中可怕的LCP停顿)。
objconv -fyasm a.out /dev/stdout | less
(它不被认为-是stdout的简写,默认情况下是将其输出到与输入文件名称相似的文件中,并附加上.asm。)
它还将分支目标添加到代码中。其他反汇编程序通常仅使用数字目标来反汇编跳转指令,并且不要在分支目标上放置任何标记来帮助您找到循环的顶部,等等。
它还比其他反汇编程序更清楚地指示NOP(使它们在填充时清晰可见,而不是仅作为另一条指令来分解。)
它是开源的,易于为Linux编译。它可以分解为NASM,YASM,MASM或GNU(AT&T)语法。
样本输出:
; Filling space: 0FH
; Filler type: Multi-byte NOP
; db 0FH, 1FH, 44H, 00H, 00H, 66H, 2EH, 0FH
; db 1FH, 84H, 00H, 00H, 00H, 00H, 00H
ALIGN 16
foo: ; Function begin
cmp rdi, 1 ; 00400620 _ 48: 83. FF, 01
jbe ?_026 ; 00400624 _ 0F 86, 00000084
mov r11d, 1 ; 0040062A _ 41: BB, 00000001
?_020: mov r8, r11 ; 00400630 _ 4D: 89. D8
imul r8, r11 ; 00400633 _ 4D: 0F AF. C3
add r8, rdi ; 00400637 _ 49: 01. F8
cmp r8, 3 ; 0040063A _ 49: 83. F8, 03
jbe ?_029 ; 0040063E _ 0F 86, 00000097
mov esi, 1 ; 00400644 _ BE, 00000001
; Filling space: 7H
; Filler type: Multi-byte NOP
; db 0FH, 1FH, 80H, 00H, 00H, 00H, 00H
ALIGN 8
?_021: add rsi, rsi ; 00400650 _ 48: 01. F6
mov rax, rsi ; 00400653 _ 48: 89. F0
imul rax, rsi ; 00400656 _ 48: 0F AF. C6
shl rax, 2 ; 0040065A _ 48: C1. E0, 02
cmp r8, rax ; 0040065E _ 49: 39. C0
jnc ?_021 ; 00400661 _ 73, ED
lea rcx, [rsi+rsi] ; 00400663 _ 48: 8D. 0C 36
...
请注意,此输出已准备好组装回目标文件,因此您可以在asm源代码级别调整代码,而不必在机器代码上使用十六进制编辑器。(因此,您不限于保持相同的大小。)不做任何更改,结果应该几乎相同。但是,由于诸如
(from /lib/x86_64-linux-gnu/libc.so.6)
SECTION .plt align=16 execute ; section number 11, code
?_00001:; Local function
push qword [rel ?_37996] ; 0001F420 _ FF. 35, 003A4BE2(rel)
jmp near [rel ?_37997] ; 0001F426 _ FF. 25, 003A4BE4(rel)
...
ALIGN 8
?_00002:jmp near [rel ?_37998] ; 0001F430 _ FF. 25, 003A4BE2(rel)
; Note: Immediate operand could be made smaller by sign extension
push 11 ; 0001F436 _ 68, 0000000B
; Note: Immediate operand could be made smaller by sign extension
jmp ?_00001 ; 0001F43B _ E9, FFFFFFE0
源代码中没有任何内容可确保将其组装为更长的编码,从而为重定位留有空间以32位偏移量对其进行重写。
如果您不想将其安装为objconv,则GNU binutilsobjdump -Mintel -d非常有用,如果您具有正常的Linux gcc设置,则已经安装了GNU binutils 。