【发布时间】:2021-12-29 07:48:48
【问题描述】:
Apple 表示,在 ARM64 Mac 上,内存区域可以具有线程的写入或执行权限。有人如何找出 lldb 中线程的内存区域的当前权限?我已经尝试过“内存区域”,但它返回 rwx。我正在开发一个将在我的 M1 Mac 上运行的即时编译器。为了测试,我做了一个即时编译器的小模拟。
#include <cstdio>
#include <sys/mman.h>
#include <pthread.h>
#include <libkern/OSCacheControl.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
size_t size = 1024 * 1024 * 640;
int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_JIT;
int fd = -1;
int offset = 0;
unsigned *addr = 0;
// allocate a mmap'ed region of memory
addr = (unsigned *)mmap(0, size, prot, flags, fd, offset);
if (addr == MAP_FAILED){
printf("failure detected\n");
exit(-1);
}
pthread_jit_write_protect_np(0);
// Write instructions to the memory
addr[0] = 0xd2800005; // mov x5, #0x0
addr[1] = 0x910004a5; // add x5, x5, #0x1
addr[2] = 0x17ffffff; // b <address>
pthread_jit_write_protect_np(1);
sys_icache_invalidate(addr, size);
// Execute the code
int(*f)() = (int (*)()) addr;
(*f)();
return 0;
}
一旦汇编指令通过 (*f)() 调用开始执行,我可以在 Xcode 中暂停执行并输入
内存区域{指令地址}
进入调试器。由于某种原因,它不断返回“rwx”。我是否使用了正确的命令或者这可能是 lldb 的错误?
【问题讨论】:
标签: memory permissions lldb apple-m1 region