首页
社区
课程
招聘
[求助]mprotect总是返回-1
发表于: 2012-12-17 09:38 9887

[求助]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 错误。)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 334
活跃值: (78)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
& ~((pagesize)-1)
2012-12-17 16:04
0
雪    币: 72
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bdw
3
这样的,我jni调用个A.so,A.so里面dlopen了B.so,dlsym也可以找到函数,可是我dlopen返回的地址不是proc/xxx/maps里面so的地址,很奇怪,dlsym都正常,可是地址不对,相同的函数在linux下正常,通过android jni一下就不行了
2012-12-17 19:40
0
游客
登录 | 注册 方可回帖
返回
//