
私は現在読んでいますLinuxカーネルの開発著者:ロバートラブ。
「15プロセスアドレス空間」の章では、彼はプロセスのメモリマップを印刷します。
user@machine:~$ pmap 1424
#all the processes mapped memory (skipped for readability)
bfffe000 (8KB) rwxp (0:00 0) [ stack ]
最後の行はスタックを示しています(下に増加)。
彼は今こう言います。
スタックは自然に読み、書き込み、実行が可能です。そうでなければあまり役に立ちません。
私が知っている限り、私たちはスタックを使ってデータとコードアドレス(関数とそのパラメータ/変数)を保存します。
スタックが実行可能でなければならない理由がわかりません。
答え1
この情報は古く、通常はスタックを実行できなくなります。
00007ffd884fa000 356K rw--- [ stack ]
GCCが構築される場合、実行可能なスタックが必要です。ネストされた関数呼び出しのためのトランポリン。これらのトランポリンは、実行時に生成されスタックに保存される小さなコードフラグメントです。したがって、使用する場合はスタックを実行できる必要があります。コンパイラはこの要件を追跡し、バイナリ(ライブラリと実行可能ファイル)にフラグを出力して、実行可能なスタックが必要かどうかを示します。以下を使用して、このフラグの値を表示および操作できます。execstack(8)
。