gcc - 什么是 GCC lto 包装器?

标签 gcc compilation wrapper cross-compiling lto

我正在使用 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/

相关文章:

c++ - C++ 链接步骤中的 undefined reference 错误

c# - 带有 Directx 11 的 WPF

c - 有没有办法解决 "overload"或重新实现 __stack_chk_fail?

c++ - 编译 sfml c++ (ubuntu)

c - c中的奇怪宏,使用多个语句

java - Javac @SuppressWarnings 注释不会删除未检查的警告

c - 带 C 包装的 Perl CGI

java - 为什么此方法重载模棱两可?

c++ - 为什么 `abs()` 的实现方式不同?

c++ - 为什么在 C++ 枚举定义中需要 typedef