【问题标题】:Building for ARM64e on Apple silicon在 M1 Apple 芯片上构建 ARM64e
【发布时间】:2021-05-25 21:05:36
【问题描述】:

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

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

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

Mach-O 64-bit executable arm64

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

Mach-O 64-bit executable arm64e

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

这是一张图片:

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

【问题讨论】:

标签: swift xcode macos apple-m1 apple-silicon


【解决方案1】:

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

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

sudo nvram boot-args=-arm64e_preview_abi

请注意,您需要禁用系统完整性保护才能执行此操作。这个 bootarg 旨在让开发人员准备他们的软件以在启用指针身份验证的情况下运行,而实际上并没有太多其他内容。

【讨论】: