问题描述
我想保护数据部分。以下程序将无法正确运行。我知道 mprotect()
的第一个参数应该对齐。但是如何获得数据段对齐的内存地址?
#include <string.h>
#include <sys/mman.h>
#include <stdio.h>
char s[] = "Hello World!";
int main() {
if(mprotect(s,strlen(s) + 1,PROT_EXEC) == -1) {
perror("mprotect()");
return 1;
}
}
$ ./mprotect_prog
mprotect(): Invalid argument
编辑:我使用以下代码来获取页面大小。
{
builtin printf %s '#define PAGESIZE '
getconf PAGESIZE
} > pagesize.h
然后将C代码改成如下。
#include <string.h>
#include <sys/mman.h>
#include <stdio.h>
#include "pagesize.h"
char s[] __attribute__((aligned(PAGESIZE))) = "Hello World!";
int main() {
if(mprotect(s,PROT_EXEC) == -1) {
perror("mprotect()");
return 1;
}
}
然后,我遇到了分段错误。有人能重现这个错误吗?有什么问题吗?
$ ./mprotect_prog
Segmentation fault
EDIT2:我必须在 's' 行下方添加以下行以确保 s
单独占据整个页面。然后,程序运行起来。
char r[] __attribute__((aligned(PAGESIZE))) = "Hello World!";
解决方法
{
builtin printf %s '#define PAGESIZE '
getconf PAGESIZE
} > pagesize.h
#include <string.h>
#include <sys/mman.h>
#include <stdio.h>
#include "pagesize.h"
char s[] __attribute__((aligned(PAGESIZE))) = "Hello World!";
char r[] __attribute__((aligned(PAGESIZE))) = "Hello World!";
int main() {
if(mprotect(s,strlen(s) + 1,PROT_EXEC) == -1) {
perror("mprotect()");
return 1;
}
}