含源码及汇编文件的项目使用链接时优化(LTO)的正确方法
LTO链接错误原因与解决方法
报错根因
你遇到的两类报错都是调用ld时参数错误、缺少必要的LTO适配配置导致的,具体如下:
第一次
plugin needed to handle lto object报错:
通过-flto编译生成的.o不是普通机器码目标文件,内部存储的是GCC的GIMPLE中间码,ld本身不支持解析这种格式,必须加载对应版本的LTO插件才能完成中间码的编译、链接流程,你第一次调用ld时没有加--plugin参数指定插件路径,因此报错。手动加插件后断言崩溃报错,是三个问题共同导致的:
- 参数冲突:你同时加了
--static和--shared两个互斥参数,分别对应静态链接、生成动态共享库,参数逻辑矛盾导致插件解析配置失败。 - 输出参数错误:你写的
-test是错误写法,ld会把它识别为要链接名为test的库,正确的输出文件参数应该是-o test,这个错误直接触发了LTO插件的参数校验断言。 - 插件版本不匹配风险:如果你用的
liblto_plugin.so不是当前arm-none-eabi-gcc对应版本的自带插件,而是主机原生GCC的插件,架构、版本不匹配也会导致崩溃。
正确的ld调用方式
调整参数后可正常链接,命令如下:
arm-none-eabi-ld --static -fPIC --fatal-warning \ --plugin <arm-none-eabi编译链根目录>/libexec/gcc/arm-none-eabi/<你的gcc版本号>/liblto_plugin.so \ test.o start.o test_main.o -o test
额外建议
优先使用arm-none-eabi-gcc作为链接前端,而非直接调用ld:GCC会自动匹配当前版本的LTO插件、自动传递和编译参数一致的架构/指令集配置到链接阶段,无需手动处理插件路径、参数匹配问题,出错概率远低于直接调用ld。
内容的提问来源于stack exchange,提问作者Adam A.
相关产品推荐
相关产品推荐

