我尝试调用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;
}