使用 MacOS 10.13 中的构建工具正确定位 MacOS 10.6

Correctly target MacOS 10.6 using the build tools from MacOS 10.13

出于纯粹的学术好奇心,我正在尝试使 MacOS GUI 应用程序超级兼容 — 这意味着它必须 运行 在 10.6 到 10.14 的所有版本的 MacOS 上;超出此范围受到 Cocoa API 和 CoreText/CoreGraphics.
差异的限制 不幸的是,该应用程序在很大程度上依赖于 C11 的几个功能,例如__auto_type,所以我不能直接在 10.6 上编译它,不得不求助于 cross-compilation。

问题是在 10.13 上链接后生成的 x86-32 Mach-O 二进制文件在其 header 中包含 3 个加载命令,10.6 的 dyld 无法识别:

  1. LC_MAIN (0x80000028)
  2. LC_DATA_IN_CODE (0x00000029)
  3. LC_SOURCE_VERSION (0x0000002A)

我的问题是:
我如何告诉 llvm-gcc 链接器避免插入这些命令,例如将 LC_MAIN 替换为更兼容的 LC_UNIXTHREAD,等等?

使用 -macosx_version_min 10.6 作为 ld 参数。这将在您的可执行文件中生成 LC_UNIXTHREAD 而不是 LC_MAIN(在您之后的其他遗留加载命令中)。