【发布时间】: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 无法识别:
- LC_MAIN (0x80000028)
- LC_DATA_IN_CODE (0x00000029)
- LC_SOURCE_VERSION (0x0000002A)
我的问题是:
如何告诉llvm-gcc 链接器避免插入这些命令,例如用更兼容的 LC_UNIXTHREAD 等替代 LC_MAIN?
【问题讨论】:
-
原来
LC_MAIN是唯一的罪魁祸首,因为其他两个无法识别的命令被忽略了。 -
@Kamil.S 成功了,谢谢!这确实比手动指定
-no_new_main更容易,所以如果你在这里复制它,我会接受它作为答案。
标签: macos linker clang cross-compiling dynamic-linking