我正在使用 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 包装器的用途以及何时需要?
最佳答案
当您编译可执行文件时,gcc 将仅针对当前文件优化和合并相同的常量。通常,它无法分析整个程序,因为 .o
文件与 ld
链接。
这就是 Interprocedural optimization 的目的:像编译单个源文件一样编译整个可执行文件,从而使代码更加静态。
这里有一个问题,LD 无法真正识别导出的 GIMPLES。
为此,ld 使用 lto 插件(liblto_plugin.so.0.0.0)调用 make 或直接调用 lto1 的lto-wrapper
,其中每个 lto1 启动负责生成一个“分区” (请参阅 gcc 文档中的 -flto-partition 选项和 lto-partitions 参数)。
关于gcc - 什么是 GCC lto 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19807107/