2

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;
}
4

2 に答える 2

0

私はメモリを保護するためにこのコードを使用しました。あなたのコードでうまくいきます。このようにメソッドを呼び出します->

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

そしてコンパイルします:gcc your_code.c __enable_execute_stack_code.h -lpthread -fbuilding-libgcc

于 2015-11-10T17:40:42.340 に答える