代码签名:苹果硅芯片与英特尔的对比
正如预期,将系统可执行文件(例如id、ls等)复制到用户目录并不会得到一个可用的可执行文件(在启动时会被发送SIGKILL信号)。
在搭载Tahoe 26.3.1的 Intel Mac上,命令:
codesign --sign - --force --preserve-metadata=entitlements,requirements,flags,runtime ./myid
将使myid可用。
在运行相同版本操作系统的Apple Silicon Mac上,情况并不会如此。有人能解释为什么吗?
解决方案
这是因为版本化的指针认证ABI(PAC)导致的。
如果你用 cc -arch arm64e 编译一个小测试程序,然后对它运行 otool -h,你应该看到类似以下的结果:
t:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 2 0x81 2 17 1056 0x00200085
现在把它与对Apple二进制执行 otool -h 的结果进行比较:
id:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 2 0x80 2 18 1368 0x00200085
这里相关的是 caps 字段。
0x80 表示版本化的PAC ABI,另一个 0x7f 指定版本——因此Apple的二进制是版本0,而自行构建的二进制则是版本1。
并且在内核中存在一个对版本0 的明确检查(an explicit check against version 0 in the kernel),仅在你是Apple二进制,或使用 -arm64e_preview_abi 启动参数时才允许执行。
我验证过,将该字段在十六进制编辑器中改为0x81,然后用你的命令重新对二进制进行签名,就会得到一个可用的二进制。
所有这些在Intel上根本不存在。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。