gcc - 如何告诉 GCC 不要将 main 的堆栈与 16 字节边界对齐?
问题描述
GCC 正在做一些巫术,它正在对齐 mymain
的堆栈,将参数的位置保存到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 正在做它正在做的事情(你可以在这里阅读),但是我试图从源代码重建的二进制文件在教程中缺少这些说明,我想生成接近教程的程序集尽可能。
这两个都是从file
,
stack0:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接,解释器 /lib/ld-linux.so.2,适用于 GNU/Linux 2.6.18,
我已经尝试过__attribute__ ((packed))
main,#pragma pack
但都没有奏效。
解决方案
您可以通过告诉 GCC 与字节对齐来禁用堆栈对齐2
,而不是16
-mpreferred-stack-boundary=2
可能会有一些性能影响。
推荐阅读
- php - 在 PHP 中从数组创建具有动态分组标题的 CSV
- c# - 取消令牌注入
- git - 如何列出所有 Git 子模块的 URL?
- c# - 在Entity Framework中通过id查询相关实体
- android - 如何旋转图像视图并在旋转时更改其上的图像?
- amazon-web-services - 使用 npx 无服务器更改区域以在 AWS CloudFront 上部署
- php - PHP 管理器 - 由于 32 位处理器,安装失败
- angular - Angular 谷歌地图 HeatmapLayer 未定义
- amazon-web-services - 如何让 k8s Pod(由 Jenkins 生成)使用服务账户 IAM 角色访问 AWS 资源
- python - 我的 Django 项目无法导入快捷方式(Pylint 导入错误)