我想知道单个应用程序是否可以同时支持 PowerPC、Intel x86 和 Apple Silicon ARM64,而不考虑实际限制(例如从 10.4 Tiger 到 14 Sonoma 的兼容性)。
这只是一个想法,不值得拿出 PearPC 或 QEMU 来测试它。
是的,因为 macOS 支持 Mach-O 通用“胖”二进制文件,它可以包含针对不同架构的任意数量的不同二进制文件。有关实际示例,请查看TinyClock:
$ file /Applications/TinyClock.app/Contents/MacOS/TinyClock
/Applications/TinyClock.app/Contents/MacOS/TinyClock: Mach-O universal binary with 5 architectures: [i386:Mach-O executable i386] [x86_64:Mach-O 64-bit executable x86_64] [ppc64:Mach-O executable ppc64] [ppc:Mach-O executable ppc] [arm64:Mach-O 64-bit executable arm64]
/Applications/TinyClock.app/Contents/MacOS/TinyClock (for architecture i386): Mach-O executable i386
/Applications/TinyClock.app/Contents/MacOS/TinyClock (for architecture x86_64):Mach-O 64-bit executable x86_64
/Applications/TinyClock.app/Contents/MacOS/TinyClock (for architecture ppc64): Mach-O executable ppc64
/Applications/TinyClock.app/Contents/MacOS/TinyClock (for architecture ppc): Mach-O executable ppc
/Applications/TinyClock.app/Contents/MacOS/TinyClock (for architecture arm64): Mach-O 64-bit executable arm64
构建这样的可执行文件实际上相当容易。一些构建工具,如 Xcode,将允许您选择所需的架构(尽管 AIUI 当前版本仅允许您选择 x86_64 和 arm64)。但如果这不是一个选项(或者不支持您想要的所有架构),您可以单独编译每个架构并使用
lipo -create
来组合可执行文件。无论如何,您可能想要这样做,因为您可能需要针对不同的 SDK 构建不同的架构,以支持支持这些不同架构的操作系统版本。
进一步阅读:Apple 开发文档“构建通用 macOS 二进制文件”、Falko 的博客“为 macOS 构建胖/通用库”、TenFourFox Development 的博客“超级 Duper 通用二进制文件”(其中包括最多 17 个二进制文件,每个二进制文件针对不同的sub架构进行了优化)。
如果你想变得真正极端,我认为通过向包含 68k 的文件添加资源分支,也可以在 PPC 和 68k 架构上支持 OS-X 之前的 Mac OS 版本“CODE”资源 和 PPC 代码片段管理器资源(尽管实际的 PPC 代码片段必须位于数据分支中——但我认为您可以将它们隐藏在 Mach-O 通用二进制文件中,也许作为额外的假二进制文件具有不存在的架构 ID)。请参阅 Apple 的 “Mac OS 运行时架构 - 适用于系统 7 至 Mac OS 9” 的第 7 章。