返回地址和堆栈布局

问题描述

我试图更好地理解堆栈是如何工作的,我编写了这个程序。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define SIZE 0

void proof(){
    unsigned int buf[SIZE];
    unsigned int i = 0;

    printf("buf is at %X\n",(unsigned int)buf);
    //printf("return address is at buf[size+4] %X\n",(unsigned int)buf[SIZE+4]);
    //printf("return address is at buf[size]+16 %X\n",(unsigned int)&buf[SIZE]+12);
    printf("Effective return address %p\n",__builtin_return_address(0));
    printf("Proof address %p\n",&proof);
}

void main(){
    proof();
}

我想象的堆栈是这样的:

返回地址
上一帧指针
变量 i
buf[SIZE]

输出中我可以看到这个函数的返回地址被放置在 buf[size+4] 中,但我不明白为什么。返回地址不应该总是在 ebp+4 吗?我曾尝试使用 gdb 获取 ebp 的地址,但它与我从代码中获得的地址不同。而且,在这种情况下,如果堆栈像我想象的那样,那么返回地址不应该在 &buf[SIZE]+12 处,因为我们正在乘以 4 移动吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)