我可以使用哪些编译器选项来进行反汇编?

What are some compiler options that I can use to get this disassembly?

我从代码中找到了可执行文件

int main(int argc, char** argv) {
  printf("Hello World\n");
  return 0;
}

可以反汇编成(使用gcc -m32编译)

此代码来自他人

; Variables:
        ;    arg_4: 12
        ;    arg_0: 8
        ;    var_4: -4
        ;    var_8: -8
        ;    var_C: -12
        ;    var_10: -16
        ;    var_18: -24
push       ebp
mov        ebp, esp
sub        esp, 0x18
call       _main+11
pop        eax                            ; CODE XREF=_main+6

mov        ecx, dword [ebp+arg_4]
mov        edx, dword [ebp+arg_0]
lea        eax, dword [eax-0x1f5b+0x1fa6] ; "Hello World!\n"

mov        dword [ebp+var_4], 0x0
mov        dword [ebp+var_8], edx
mov        dword [ebp+var_C], ecx

mov        dword [esp+0x18+var_18], eax  ; method imp___symbol_stub__printf
call       imp___symbol_stub__printf
xor        ecx, ecx                           
mov        dword [ebp+var_10], eax
mov        eax, ecx                                    
add        esp, 0x18                           
pop        ebp
ret

但是当我从相同的代码反汇编可执行文件时(使用 gcc -m32 编译)

我得到了一个很长的反汇编代码(here is the link)

我的问题是

  1. 为什么相同代码的指令不同?或者,它们是一样的吗?

  2. 是否有任何我可以使用的编译器或编译器选项给我提供与其他人一样的反汇编代码?

  3. 您是否推荐任何我可以阅读以理解长汇编代码中的术语的参考资料? (比如__x86.get_pc_thunk.dx)

此致, 泰森

  1. 您正在查看两个不同版本的反汇编。一种是 AT&T 语法,另一种是 Intel。此外,link 包含所有程序集,而您此处的代码段仅包含主要功能。
  2. 编译器选项将更改输出并导致进行更多优化。大部分反汇编器都有语法切换的功能(我觉得intel比较常见)。
  3. 这是由 GCC 生成的东西,因此您的代码可以使用 link 内置到 linux/bsd 中的动态库。 thunk 提供了一种解析 function 地址的方法。