私はスタックに何かを書き込もうとすると、次のコードを持っています。私はスタックの一番下に書きます。まだアプリケーションは触れていません(スタックは下に向かって成長し、stackaddrはここを指しています)。ここでセグメンテーションフォルトが発生するのはなぜですか?
しかし私も両方の書き込みを与えることMPROTECTをやった後、セグメンテーションフォールトを取得し、そのメモリ領域へのアクセス権をお読みください。コンパイルフラグ-fno-stack-protectorを使用しても、セグメンテーション違反が発生します。ここで何が起きてるの?
pthread_attr_t attr;
void * stackaddr;
int * plocal_var;
size_t stacksize;
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, &stackaddr, &stacksize);
printf("stackaddr = %p, stacksize = %d\n", stackaddr, stacksize);
plocal_var = (int*)stackaddr;
mprotect((void*)plocal_var, 4096, PROT_READ | PROT_WRITE);
*plocal_var = 4;
printf("local_var = %d!\n", *plocal_var);
あなたの質問が何であるかを少なくとも示唆するタイトルを試してみてください。 – Mat
'stackaddr'の値を表示し、'/proc/pid/maps'を見てそこに実際にメモリがマップされていることを確認してください。また、 'mprotect'の戻り値を確認してください。おそらく手がかりを与えるでしょう。 –