次の 2 つの (簡略化された) 例が segfault を実行するのはなぜですか (Win7 で GCC でコンパイル)。
ケース 1 - 関数ポインタへの書き込み
void f() {return;}
int main()
{
memcpy(&f, "", 1);
return 0;
}
ケース 2 - データ ポインターの呼び出し
char f[] ={0xC3};
typedef void(*p)();
int main()
{
((p)f)();
return 0;
}
メモリの RO セクションを書き込んでいて、実行不可能なメモリ セクションにジャンプしているためです。(またはそのようなもの)。私の質問は、大局的な意味での「なぜ」
です。これを正確に実施するシステムは何ですか? それはOSレベルですか?ハードウェアレベルで?ハードウェアレベルですが、バイナリをメモリにロードするときに OS によって設定する必要がありますか? これはどのサブシステムですか? 等...
「なぜ」よりも「どのように」の方が適切な質問かもしれません。