在主线程的堆栈上调用mprotect总是失败

时间:2015-11-09 05:44:57

标签: c multithreading mprotect

我尝试在主线程的堆栈上调用mprotect,但它总是失败。每次我尝试时,都会产生ENOMEM错误。我已经检查了/ proc / [pid] / maps,整个堆栈映射在地址空间中。但是,我可以从主堆栈成功调用子线程堆栈上的mprotect。主线程的堆栈必须有一些特殊的东西,以防止mprotect改变它自己。但我无法找到任何相关文件。有人有想法吗?

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>
#include <pthread.h>
#include <stdio.h>

void * addr;
size_t size;

void * thread(void * tls) {
    sleep(1);
    if (mprotect(addr, size, PROT_NONE) == -1) perror(NULL);
    return NULL;
}

int main(int argc, const char *argv[]) {
    pthread_attr_t attr;
    pthread_getattr_np(pthread_self(), &attr);
    pthread_attr_getstack(&attr, &addr, &size);

    pthread_t th;
    pthread_create(&th, NULL, thread, NULL);
    sleep(2);
    pthread_join(th, NULL);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您尝试对未映射的页面进行保护。如果您检查pthread_attr_getstack的来源,您会发现没有mmap.Stack页面按需映射。 this might help you

答案 1 :(得分:0)

我使用此code来保护meory。它可以很好地处理您的代码。 调用此方法 - &gt;

39     pthread_attr_getstack(&attr, &addr, &size);
40     __enable_execute_stack(&addr);

并编译:{{1​​}}