我正在使用buildroot为嵌入式系统准备图像。我想导出buildroots内部交叉编译器,以便其他人可以使用相同的版本,在命令检查GCC版本后:arm-linux-gcc -v
我看到配置COLLECT_LTO_WRAPPER
到我的硬盘上的静态位置
COLLECT_LTO_WRAPPER=/home/user/arm/buildroot/output/host/usr/libexec/gcc/arm-unknown-linux-uclibcgnueabi/4.7.1/lto-wrapper
在其他系统上不正确。
我只能发现LTO意味着链路时间优化。你能解释一下lto包装器用于何时需要什么?
答案 0 :(得分:15)
编译可执行文件时,gcc将仅为当前文件优化和合并相同的常量。通常,它无法分析整个程序,因为.o
文件与ld。链接。
这就是Interprocedural optimization的目的:将整个可执行文件编译为单个源文件,允许使代码更加静态。
这是一个问题,LD无法真正识别导出的GIMPLES
为此,ld使用调用make的lto插件(liblto_plugin.so.0.0.0)或直接调用lto1的lto-wrapper
,其中每个lto1 lauch负责生成'分区'(参见 - flto-partition选项和gcc文档中的lto-partitions参数。)