在 Apple 芯片上构建 ARM64e

Woo*_*ock 11 macos xcode swift apple-silicon apple-m1

我正在构建我的命令行应用程序,并注意到我创建的所有二进制文件都是类型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 之外没有人使用?

Sir*_*ens 7

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

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

sudo nvram boot-args=-arm64e_preview_abi
Run Code Online (Sandbox Code Playgroud)

请注意,您需要禁用系统完整性保护才能执行此操作。这个 bootarg 的目的是允许开发人员准备他们的软件,以便在启用指针身份验证的情况下运行,实际上没有什么其他的了。