19

我正在使用 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 包装器的用途以及何时需要?

4

1 回答 1

18

当你编译一个可执行文件时,gcc 将只为当前文件优化和合并相同的常量。通常,它无法分析整个程序,因为.o文件与ld.

这就是过程间优化的目的:编译整个可执行文件,就好像它是一个单一的源文件,允许使代码更加静态。

这有一个问题,LD 无法真正识别导出的 GIMPLES。
为此,ld 使用调用 make 或lto-wrapper直接调用 lto1 的 lto 插件(liblto_plugin.so.0.0.0),其中每个 lto1 启动负责生成“分区”(请参阅​​ -flto-partition 选项和gcc 文档中的 lto-partitions 参数)。

于 2013-12-08T01:46:18.263 回答