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

标签 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. 您正在查看两个不同版本的反汇编。一种是 AT&T 语法,另一种是 Intel。此外,该链接包含所有程序集,而您此处的代码段仅包含主要功能。
  2. 编译器选项将改变输出并导致更多的优化发生。大多数反汇编器都有语法切换的能力(我觉得 intel 比较常见)。
  3. 这是由 GCC 生成的,因此您的代码可以使用构建到 linux/bsd 中的动态链接库。 thunk 提供了一种方法来解析 function 的地址。 .

关于c - 我可以使用哪些编译器选项来进行反汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299839/

相关文章:

c - fread 在c中用随机字符填充字符串

c - 如何以编程方式从证书中提取信息?

c - 设置指向二维数组的指针,然后将该指针传递给函数

c - 从 32 位拖放到 64 位

c++ - 为什么 C++ 编译器有很多优化级别

c++ - 为什么编译器会生成这个程序集?

python - Python 中具有多个参数的方法的多重处理

disassembly - 如何理解 Mach-O 符号表

reverse-engineering - 新的堆栈帧建立后指令 "push 0FFFFFFFFh"有什么意义?

.net - 部分反汇编 .net 可执行文件