小编Kla*_*ius的帖子

macOS v10.15 (Catalina) / x64 上的自修改代码

作为移植 Forth 编译器的一部分,我正在尝试创建一个允许自修改代码的二进制文件。血淋淋的细节位于https://github.com/klapauciusisgreat/jonesforth-MacOS-x64

理想情况下,我为用户定义创建一堆页面并调用 mprotect,如下所示:

#define __NR_exit 0x2000001
#define __NR_open 0x2000005
#define __NR_close 0x2000006
#define __NR_read 0x2000003
#define __NR_write 0x2000004
#define __NR_mprotect 0x200004a

#define PROT_READ 0x01
#define PROT_WRITE 0x02
#define PROT_EXEC 0x04
#define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)
#define PAGE_SIZE 4096


// https://opensource.apple.com/source/xnu/xnu-201/bsd/sys/errno.h
#define EACCES    13              /* Permission denied */
#define EINVAL    22              /* Invalid argument */
#define ENOTSUP   45              /* Operation not supported */


/* Assembler entry point. */
        .text
        .globl start
start:
        // Use mprotect to …
Run Code Online (Sandbox Code Playgroud)

macos assembly x86-64 forth macos-catalina

5
推荐指数
1
解决办法
758
查看次数

MacOS(ARM64 架构)上的 mmap() RWX 页面?

我一直在尝试映射一个既可写又可执行的页面。

    mov x0, 0                   // start address
    mov x1, 4096                // length
    mov x2, 7                   // rwx
    mov x3, 0x1001              // flags
    mov x4, -1                  // file descriptor
    mov x5, 0                   // offset
    movl x16, 0x200005c         // mmap
    svc 0   
Run Code Online (Sandbox Code Playgroud)

这给了我一个 0xD 错误代码(EACCESS,文档毫无帮助地将其归咎于无效的文件描述符,尽管相同的文档说使用“-1”)。我认为代码是正确的,如果我只是传递“r--”以获得权限,它会返回一个有效的 mmap。

我知道相同的代码可以在 Catalina 和 x64 架构中工作。我测试了禁用 SIP 模式时会发生相同的错误。

为了获得更多上下文,我正在尝试将 FORTH 实现移植到 MacOs/ARM64,而这个 FORTH 与许多其他实现一样,在运行时大量使用自修改代码/汇编代码。并且进行汇编/编译的代码驻留在新创建的代码的中间(事实上,编译器的一部分将作为运行 FORTH 的一部分以机器语言生成),因此分离 FORTH JIT 编译器是非常困难/不可行的(如果你这样称呼它)来自生成的代码。

现在,我真的不想最终得到这样的答案:“苹果认为他们比你更了解,不适合你!”,但这就是到目前为止的样子。谢谢你的帮助!

macos apple-silicon apple-m1

5
推荐指数
1
解决办法
974
查看次数

M1 Mac 上使用哪些汇编程序?规范文档在哪里?

我想更好地了解哪些汇编程序实际上在 M1/M2 MacO 机器(例如 MacBook Pro)上工作。

\n
    \n
  1. 据我了解,我可以使用的唯一可能的汇编器是Apple提供的“as”。M1+ 机器不再支持 Gnu 汇编程序(\'gas\'):\'as -Q\' 是这样说的。但许多网站提到Apple汇编器确实没有维护,并且有一个切换到llvm-clang汇编器的方法,我没有找到有用的文档(用于运行汇编器,而不是构建编译器)。
  2. \n
\n

真的 ?

\n
    \n
  1. 我正在查看文档,大多数情况下只找到“Mac OS X 汇编程序指南”。这是一个非常旧的副本,我什至不知道在哪里可以获得最新版本。
  2. \n
\n

这看起来不错,但似乎并不完全完整 \xe2\x80\x93 例如,您可以使用带有命名参数的宏,而不是仅在 \'as\' 中使用 $0, ... $n 。指南中没有提到。

\n

有什么好的建议可以从gas移植到苹果汇编器吗?已知问题和解决方案?

\n

例如,在“gas”中,我相信我可以使用 .set 重新定义符号,但不能使用“as”。\n我确实是一个非常缺乏经验的汇编爱好者,所以一些规范资源会很棒。在我今天看来,M1 Mac 上的汇编编程与其说是一门科学,不如说是一种黑暗艺术。

\n

感谢您的任何启发。

\n

macos assembly apple-silicon apple-m1

4
推荐指数
1
解决办法
1011
查看次数