代码签名:苹果硅芯片与英特尔的对比

编程语言 2026-07-11

正如预期,将系统可执行文件(例如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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章