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

时间:2019-01-22 00:58:51

标签: c compiler-optimization 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 个答案:

答案 0 :(得分:0)

  1. 您正在查看反汇编的两个不同版本。一种是AT&T语法,另一种是Intel。此外,该链接具有所有程序集,并且您的代码段仅具有主要功能。
  2. 编译器选项将更改输出并引起更多优化。大多数反汇编程序都具有切换语法的能力(我认为intel比较常见)。
  3. 这是GCC生成的,因此您的代码可以使用linux / bsd中内置的动态链接库。重排提供了一种解析function地址的方法。