プログラムを実行すると、
#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 まで) 実行すると、いくつかの奇妙な数字と、一連のゼロで区切られた 2 つの領域のようなものを確認できます。これは、おそらく環境変数の上書きを防止しようとするためです。うっかり。
とにかく、最初の領域には、各関数呼び出しのすべてのフレームなど、多くの数値が必要です。
各フレームの終わり、パラメーターの場所、コンパイラーがカナリアを追加した場合のカナリアの場所、戻りアドレス、CPU ステータスなどをどのように区別できますか?