如何保护数据部分?

问题描述

我想保护数据部分。以下程序将无法正确运行。我知道 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;
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...