如何告诉GCC不要将main的堆栈对齐16字节边界?

时间:2018-11-06 23:08:42

标签: gcc stack alignment main

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都不起作用。

1 个答案:

答案 0 :(得分:0)

您可以通过告诉GCC对齐2字节而不是16字节来禁用堆栈对齐

-mpreferred-stack-boundary=2

可能会影响性能。