我正在运行下面的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;
}
答案 0 :(得分:1)
那可能是selinux。
然而,真正的问题是为什么你要对你没有明确mmap的东西调用mprotect。事实上,如果你真的需要不同的权限,为什么不使用mmap?奖金问题是为什么你认为你需要PROT_EXEC。