如果我运行一个程序,就像
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
printf("My references are at %p, %p, %p\n", &argc, &argv, &env);
}
我们可以看到那些区域实际上是在堆栈中的。 但还有什么?如果我们在Linux 3.5.3中运行一个循环(例如,直到segfault),我们可以看到一些奇怪的数字,以及由一堆零分隔的两个区域,可能是为了防止意外覆盖环境变量。
无论如何,在第一个区域中必须有很多数字,例如每个函数调用的所有帧。
我们如何区分每个帧的结尾,在哪里是参数,编译器添加的canary在哪里,返回地址,CPU状态等等?