我试图在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
解决了这个问题,但重点是分配可执行内存。为什么不管用?我该怎么弥补?
1条答案
按热度按时间rwqw0loc1#
看起来你至少需要
MAP_JIT
,但即使这样也不能保存你的Apple Silicon:This Apple document声明:
当启用内存保护时,线程不能同时写入内存区域并执行该区域中的指令。Apple Silicon为所有应用程序提供内存保护,无论它们是否采用Hardened Runtime。基于英特尔的Mac电脑仅为采用强化运行时的应用程序启用内存保护。
它继续解释你需要做什么。引用起来有点长,但归结起来就是使用
pthread_jit_write_protect_np
在写入之前禁用内存保护,并在执行之前再次启用它。