【发布时间】:2016-01-07 09:26:36
【问题描述】:
考虑一个程序:
#include <stdio.h>
void function(int a, int b, int c){
char buffer1[5];
char buffer2[10];
}
void main(){
function(1,2,3);
}
编译这个
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];
}
考虑同一程序的另一个变体:
#include <stdio.h>
void function(int a, int b, int c){
char buffer1[7];
char buffer2[10];
}
void main(){
function(1,2,3);
}
关于使用我得到的相同命令编译和生成转储:
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];
}
我的问题是什么导致堆栈指针在第一种情况下减少 16,在第二种情况下减少 32,而在第二种情况下只需要 2 个字节?
我在英特尔处理器上运行 64 位 ubuntu 14.04
【问题讨论】:
-
看起来像堆栈对齐。 ceil(log2(15)) == 4, 2^4 == 16. ceil(log2(17)) == 5, 2^5 == 32。
-
我不明白其中的奥秘。这不是很明显吗?了解您的期望或您想要解释的内容真的很有帮助。
-
@DavidSchwartz 我认为他只是在解释为什么实际上只需要多 2 个字节时使用了 16 个字节以上的堆栈空间。
-
@MichaelWalz 那么我们对他的问题有三种可能的解读!