【问题标题】:Correctly target MacOS 10.6 using the build tools from MacOS 10.13使用 MacOS 10.13 中的构建工具正确定位 MacOS 10.6
【发布时间】:2022-01-11 08:43:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 原来LC_MAIN是唯一的罪魁祸首,因为其他两个无法识别的命令被忽略了。
  • @Kamil.S 成功了,谢谢!这确实比手动指定-no_new_main 更容易,所以如果你在这里复制它,我会接受它作为答案。

标签: macos linker clang cross-compiling dynamic-linking


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2018-03-14
    • 2018-03-14
    • 2021-10-31
    • 2021-05-02
    相关资源
    最近更新 更多