使用MacOS 10.13构建工具编译适配MacOS 10.6应用的方法问询
MacOS 10.6~10.14兼容交叉编译链接器配置方案
- 替换LC_MAIN为LC_UNIXTHREAD:给链接器传入
-no_new_main参数,该参数会强制ld使用10.6原生支持的传统线程入口加载命令,替代10.7版本后才引入的LC_MAIN。 - 禁用LC_SOURCE_VERSION加载命令:传入
-no_source_version参数,直接禁止链接器生成该10.6 dyld无法识别的加载项。 - 禁用LC_DATA_IN_CODE加载命令:传入
-no_data_in_code参数,同时建议在编译阶段同步添加-fno-data-sections参数,避免目标文件残留数据段标记导致链接器意外生成该加载命令。
基础必填配置
所有编译、链接环节必须显式指定-mmacosx-version-min=10.6参数,该参数会让工具链全局适配10.6的ABI与加载规则,避免出现隐性兼容性问题。
完整调用示例
如果通过llvm-gcc间接调用链接器,所有链接器参数需要添加-Wl,前缀,多个参数用逗号分隔,32位x86架构编译示例如下:
llvm-gcc -m32 -mmacosx-version-min=10.6 -std=c11 your_source.c -o output_binary -Wl,-no_new_main,-no_source_version,-no_data_in_code
生效验证
编译完成后可通过otool命令检查加载命令是否符合要求:otool -l output_binary | grep -E 'LC_(MAIN|DATA_IN_CODE|SOURCE_VERSION|UNIXTHREAD)'
若输出结果中仅出现LC_UNIXTHREAD,无另外三个被禁用的加载命令,即为配置生效。
内容的提问来源于stack exchange,提问作者hidefromkgb
相关产品推荐
相关产品推荐

