为什么mmap无法在macOS上分配可执行页面?

tcomlyy6  于 2023-04-29  发布在  Mac
关注(0)|答案(1)|浏览(210)

我试图在macOS 13上运行这个答案https://stackoverflow.com/a/38974980中的代码示例,程序给出了分段错误。
实际上,让我们将上面链接的程序简化为

#include<sys/mman.h>
#include<stddef.h>
int main(){
    size_t size = 100;
    char* buf = (char*) mmap(NULL, (size_t) size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    *buf = 'a';
    return 0;
}

即使是这个简单的程序在macOS上也会出现分割错误。mmap不返回空指针,但无法访问该指针。删除PROT_EXEC解决了这个问题,但重点是分配可执行内存。为什么不管用?我该怎么弥补?

rwqw0loc

rwqw0loc1#

看起来你至少需要MAP_JIT,但即使这样也不能保存你的Apple Silicon:
This Apple document声明:
当启用内存保护时,线程不能同时写入内存区域并执行该区域中的指令。Apple Silicon为所有应用程序提供内存保护,无论它们是否采用Hardened Runtime。基于英特尔的Mac电脑仅为采用强化运行时的应用程序启用内存保护。
它继续解释你需要做什么。引用起来有点长,但归结起来就是使用pthread_jit_write_protect_np在写入之前禁用内存保护,并在执行之前再次启用它。

相关问题