我从代码中发现了可执行文件
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)
我的问题是
为什么相同代码的指令不同?或者,它们是否相同?
是否有任何我可以使用的编译器或编译器选项给我反汇编代码,就像从其他人那里得到的一样?
您是否推荐任何我可以阅读以理解长汇编代码中的术语的引用资料? (例如 __x86.get_pc_thunk.dx)
最好的问候, 泰森
最佳答案
- 您正在查看两个不同版本的反汇编。一种是 AT&T 语法,另一种是 Intel。此外,该链接包含所有程序集,而您此处的代码段仅包含主要功能。
- 编译器选项将改变输出并导致更多的优化发生。大多数反汇编器都有语法切换的能力(我觉得 intel 比较常见)。
- 这是由 GCC 生成的,因此您的代码可以使用构建到 linux/bsd 中的动态链接库。 thunk 提供了一种方法来解析 function 的地址。 .
关于c - 我可以使用哪些编译器选项来进行反汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299839/