c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?
我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白. 这是目标计划:
以下是在运行Ubuntu 12.04且禁用ASLR的x86虚拟机上编译它的命令.
当我在堆栈上查看该程序的内存时,我看到buf的地址为0xbffffc40.此外,保存的帧指针存储在0xbffffd48,返回地址存储在0xbffffd4c. 这些特定地址不相关,但我观察到即使buf只有256长度,距离0xbffffd48 – 0xbffffc40 = 264.符号上,这个计算是$fp – buf. 为什么buf的结尾和堆栈中存储的帧指针之间有8个额外的字节? 这是函数foo的一些反汇编.我已经检查了它,但我没有看到该内存区域的任何明显用法,除非它是隐含的(即某些指令的副作用).
最佳答案
Basile Starynkevitch因提及对齐而获奖.
事实证明,gcc 4.7.2默认将帧边界与4字边界对齐.在32位仿真硬件上,即16字节.由于保存的帧指针和保存的指令指针一起只占用8个字节,编译器在buf结束后再放入8个字节,使堆栈帧的顶部与16字节边界对齐. 使用以下附加编译器标志,8个字节消失,因为8个字节足以对齐2个字的边界.
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |