在 Apple 芯片上构建 ARM64e

Building for ARM64e on Apple silicon

我正在构建我的命令行应用程序,并注意到我创建的所有二进制文件都是 arm64.

类型

但是,macOS 11.4 附带的所有 bin 都是 arm64e

即运行 file 我在 M1 MacBook 上构建的应用程序显示:

Mach-O 64-bit executable arm64

然而,运行 系统上的文件 xxd 应用程序在同一台机器上显示:

Mach-O 64-bit executable arm64e

我查看了 Xcode,但看不出如何增强它,Xcode 不应该构建 arm64e 吗?如果是这样,我怎样才能达到同样的效果?

这是一张照片:

编辑:我认为答案可能是,arm64e ABI 不稳定,除 Apple 外没有人使用?

针对 arm64 和 arm64e 的主要区别在于 ARMv8.3's Pointer Authentication Codes。由于特定的 ABI 尚未稳定,Apple 仅将其用于他们自己的平台代码,因为他们可以通过发布新的 OS 轻松地使用不同的 ABI 重新编译整个 OS 版本,而他们不能确实迫使所有开发人员开始使用新的 ABI。

尽管如此,您只需在体系结构下拉列表中选择“其他...”并输入 arm64e 即可为 arm64e 进行编译。默认情况下,macOS 将拒绝 运行 任何具有 arm64e 切片的 non-Apple 代码(因为他们想阻止任何人在 ABI 稳定之前发布 arm64e 代码)。但是,您可以通过设置 arm64e_preview_abi bootarg:

来覆盖此行为并允许 macOS 到 运行 non-Apple arm64e 代码
sudo nvram boot-args=-arm64e_preview_abi

请注意,您需要禁用系统完整性保护才能这样做。这个 bootarg 旨在允许开发人员准备他们的软件以 运行 启用指针身份验证,实际上没有其他。