【问题标题】:How can I tell GCC not to align main's stack to 16-byte boundary?如何告诉 GCC 不要将 main 的堆栈与 16 字节边界对齐?
【发布时间】:2019-04-10 09:50:13
【问题描述】:

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:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接,解释器 /lib/ld-linux.so.2,适用于 GNU/Linux 2.6.18,


我在 main 上尝试了 __attribute__ ((packed)),而 #pragma pack 都没有成功。

【问题讨论】:

    标签: gcc stack alignment main


    【解决方案1】:

    您可以禁用堆栈对齐,方法是告诉 GCC 对齐到 2 字节,而不是 16

    -mpreferred-stack-boundary=2
    

    可能会对性能产生一些影响。

    【讨论】:

    • 请注意,值 2 表示对齐到 2 的幂 2 = 4 个字节
    猜你喜欢
    • 2011-08-24
    • 2013-03-05
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2020-03-26
    • 2017-09-07
    相关资源
    最近更新 更多