-
-
[求助]mprotect总是返回-1
-
发表于:
2012-12-17 09:38
9887
-
本人在使用mprotect的时候总是返回失败,网上查了下,资料很少,好像和传入的地址有关系,说是要页对齐,可是我对齐了还是返回异常,这个网上资料好少,求哪位大牛解释下。
---------------------
void * handler = dlopen("./a.so", RTLD_LAZY);
if (mprotect((int)handler &(((pagesize)-1) ^ (pagesize - 1)), pagesize,
PROT_NONE) == -1)
handle_error("mprotect");
--------------------
mprotect - 在一个内存区域设置保护属性
概要
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
描述
mprotect() 更改调用进程的包含 [addr, \fIaddr+len-1] 在其中的内存页的保护属性。addr 必需是页边缘对齐的。
如果调用进程内存访问行为侵犯了保护规则,内核会为该进程产生 SIGSEGV 信号。
prot 是 PROT_NONE 或是下面值的“位或”运算结果:
PROT_NONE
内存根本不能访问。
PROT_READ
内存可读。
PROT_WRITE
内存可写。
PROT_EXEC
内存可执行。
返回值
成功时,mprotect() 返回零。错误时,返回 -1,并把 errno 设置为合适的值。
错误
EACCES
该内存不能设置为相应权限。这是可能发生的,比如,如果你 mmap(2) 映射一个文件为只读的,接着使用 mprotect() 标志为 PROT_WRITE。
EINVAL
addr 不是一个有效的指针,或者不是系统页尺寸的整数倍。
ENOMEM
内核内部的结构体无法分配。
ENOMEM
进程的地址空间在区间 [addr, addr+len] 是无效的地址,或者一个或多个页没有映射。(2.4.19 内核之前,这些情况会产生一个不合适的 EFAULT 错误。)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!