如果我运行一个程序,就像
#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),我们可以看到一些奇怪的数字,以及由一堆零分隔的两个区域,可能是为了防止覆盖环境变量偶然。
无论如何,在第一个区域中必须有很多数字,例如每个函数调用的所有帧。
我们如何区分每一帧的结束,参数在哪里,如果编译器添加了一个金丝雀,返回地址,CPU状态等等?