考虑一个程序:
#include <stdio.h>
void function(int a, int b, int c){
char buffer1[5];
char buffer2[10];
}
void main(){
function(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)
用
gcc test.c -m32 -g -o test -fno-stack-protector 编译
并执行
objdump -S test> test.dis
我获得了函数"function"的以下转储
void function(int a, int b, int c){
80483ed: 55 push %ebp
80483ee: 89 e5 mov %esp,%ebp
80483f0: 83 ec 10 sub $0x10,%esp
char buffer1[5];
char buffer2[10];
}
Run Code Online (Sandbox Code Playgroud)
考虑同一程序的另一个变体:
#include <stdio.h>
void function(int a, int b, int c){
char buffer1[7];
char buffer2[10];
}
void main(){
function(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)
在使用相同的命令编译和生成转储时,我得到:
void function(int a, int b, int c){
80483ed: 55 push %ebp
80483ee: 89 e5 mov %esp,%ebp
80483f0: 83 ec 20 sub $0x20,%esp
char buffer1[7];
char buffer2[10];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是什么原因导致堆栈指针在第一种情况下减少16而在第二种情况下减少32,而在第二种情况下只需要2个字节?
我在英特尔处理器上运行64位ubuntu 14.04
-mpreferred-stack-boundary= num
尝试将堆栈边界保持对齐2到num字节边界.如果-mpreferred-stack-boundary未指定,则默认值为 4(16字节或128位),除非优化代码大小(-Os),在这种情况下,默认值是最小正确对齐(x86为4个字节,x86-64为8个字节) .
因此,当堆栈上为数组分配空间时,堆栈也在16字节的默认边界上对齐.在第一种情况下,您有15个字节的数据小于16,因此分配了16个字节.在第二种情况下,你有17个字节的数据超过16但小于(16的下一个数字)32,所以分配了32个字节的空间.
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |