GCC正在将我的main
的堆栈对齐,从而将自变量的位置保存到ecx
0x08049060 8d4c2404 lea ecx, [arg_4h] ; 4 ; [13] -r-x section size 465 named .text
0x08049064 83e4f0 and esp, 0xfffffff0
0x08049067 ff71fc push dword [ecx - 4]
0x0804906a 55 push ebp
0x0804906b 89e5 mov ebp, esp
0x0804906d 51 push ecx
然后,以后
0x080490a4 8b4dfc mov ecx, dword [local_4h]
0x080490a7 83c410 add esp, 0x10
0x080490aa c9 leave
0x080490ab 8d61fc lea esp, [ecx - 4]
0x080490ae c3 ret
我相信我理解为什么 GCC正在执行其操作(you can read about it here),但是我尝试从源代码重建的二进制文件在本教程中缺少这些说明,我希望生成尽可能接近本教程的程序集。
这两个都是从file
返回的,
stack0:用于GNU / Linux 2.6.18的ELF 32位LSB可执行文件,英特尔80386版本1(SYSV),动态链接,解释器/lib/ld-linux.so.2,
我主要尝试过__attribute__ ((packed))
,而#pragma pack
都不起作用。
答案 0 :(得分:0)
您可以通过告诉GCC对齐2
字节而不是16
字节来禁用堆栈对齐
-mpreferred-stack-boundary=2
可能会影响性能。