Почему я получаю ошибку сегментации здесь? - PullRequest
0 голосов
/ 04 января 2012

У меня есть следующий код, где я пытаюсь что-то записать в стек.Я пишу в нижней части стека, который приложение до сих пор не коснулось (обратите внимание, что стек растет вниз и 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 );

1 Ответ

3 голосов
/ 05 января 2012

Вы почти наверняка пытаетесь mprotect() страниц, которые еще не отображаются. Вам следует проверить код возврата: mprotect(), вероятно, возвращает -1 и устанавливает errno в ENOMEM (это задокументировано в справочной странице mprotect(2) ).

Страницы стека отображаются по требованию, но ядро ​​достаточно умен, чтобы различать ошибки страниц, вызванные доступом к текущему указателю стека или выше него (которые вызваны действительными попытками расширения стека вниз путем уменьшения указателя стека). и затем выполнение чтения или записи с некоторым положительным смещением от нового значения) и сбои страниц, вызванные доступом ниже указателя стека (которые недопустимы).

...