mprotect()RHEL 6.8

时间:2016-12-15 22:43:20

标签: linux linux-kernel rhel6 rhel5

我正在运行下面的C程序,并在RHEL 5.11和RHEL 6.8上执行时获得不同的结果。 在5.11上,输出为:

页面大小为4096

memalign()在0x12791000分配的内存

保护成功

在6.8时,输出为:

页面大小为4096

由memalign()在0xea6000

分配的内存

mprotect失败:权限被拒绝

有没有人知道为什么会这样?是否需要设置内核参数?

这是C程序:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/mman.h>

static void domp( void *, long );

static void domp( void *pmem, long psz ) {
    if (mprotect( pmem, psz, PROT_READ | PROT_WRITE | PROT_EXEC ) == -1) {
       perror( "mprotect failed" );
    } else {
       printf( "mprotect success\n" );
    }
}

int main( int argc, char *argv[] ) {
    long lpsz;
    void *lmem;

    lpsz = sysconf(_SC_PAGESIZE);
    printf( "Page size is %ld\n", lpsz );

    if ((lmem = memalign( lpsz, lpsz )) == NULL) {
       perror( "memalign failed" );
       exit (-1);
    }
    printf( "Memory allocated by memalign() at %p\n", lmem );
    domp( lmem, lpsz );

    return 0;
}

1 个答案:

答案 0 :(得分:1)

那可能是selinux。

然而,真正的问题是为什么你要对你没有明确mmap的东西调用mprotect。事实上,如果你真的需要不同的权限,为什么不使用mmap?奖金问题是为什么你认为你需要PROT_EXEC。