返回地址和堆栈布局

时间:2021-07-09 11:03:15

标签: c assembly x86 stack-frame

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

#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 移动吗?

0 个答案:

没有答案