出于纯粹的学术好奇心,我试图使MacOS GUI应用程序超级兼容——这意味着它必须在10.6到10.14的所有版本的MacOS上运行;超出这个范围受到Cocoa API和CoreText/CoreGraphics的差异的限制
不幸的是,该应用程序在很大程度上依赖于C11的几个功能,例如__auto_type
,所以我不能只在10.6上编译它,必须进行交叉编译。
问题是,在10.13链接后,生成的x86-32 Mach-O二进制文件在其标头中包含10.6的dyld
无法识别的3个加载命令:
- LC_MAIN(0x80000028(
- LC_DATA_IN_CODE(0x00000029(
- LC_SOURCE_VERSION(0x0000002A(
我的问题是:
如何告诉llvm-gcc
链接器避免插入这些命令,例如用更兼容的LC_UNIXTHREAD替换LC_MAIN等。?
使用-macosx_version_min
10.6作为ld
参数。这将在您的可执行文件中生成LC_UNIXTHREAD
而不是LC_MAIN
(以及您想要的其他遗留加载命令(。