【发布时间】:2014-10-06 04:47:51
【问题描述】:
我有这个 C 的简短 sn-p:
const char *name = "/asdf";
int desc = shm_open(name, O_RDWR | O_CREAT, 0777);
ftruncate(desc, 4096);
void *block = mmap(NULL, 4096, PROT_EXEC, MAP_SHARED, desc, 0);
shm_unlink(name);
它创建了一个共享内存对象,每个人都可以写、读和执行;然后将其映射到具有可执行权限的内存中。但是,由于某种原因,mmap 调用失败并显示为EPERM。
Strace 给出以下信息:
statfs("/dev/shm/", {f_type=0x1021994, f_bsize=4096, f_blocks=450722, f_bfree=450372, f_bavail=450372, f_files=450722, f_ffree=450713, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0
futex(0x7fa7f4c8b330, FUTEX_WAKE_PRIVATE, 2147483647) = 0
open("/dev/shm/asdf", O_RDWR|O_CREAT|O_NOFOLLOW|O_CLOEXEC, 0777) = 3
fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
ftruncate(3, 4096) = 0
mmap(NULL, 4096, PROT_EXEC, MAP_SHARED, 3, 0) = -1 EPERM (Operation not permitted)
问题似乎是由使用PROT_EXEC 引起的,因为只要没有PROT_EXEC,mmap 使用任何权限组合都会成功。mmaping 没有执行权限,然后尝试@ 987654329@ 也失败了。
【问题讨论】:
标签: executable virtual-memory shared-memory mmap