为何GCC Bootstrap编译后stage-2与stage-3不一致?附解决办法
在Arch Linux上编译GCC 12.2.0时LTO导致Bootstrap对比失败的解决方法
正常编译流程(无LTO)
- 克隆GCC官方Git仓库:
git clone git://gcc.gnu.org/git/gcc.git - 切换到GCC 12.2.0版本标签:
git checkout releases/gcc-12.2.0 - 在源码目录外创建独立编译目录:
mkdir gcc-build cd gcc-build - 执行配置脚本(无额外参数):
../gcc/configure - 并行编译:
make -j8
此阶段stage-2与stage-3编译产物一致,无报错。
问题复现
当通过BOOT_CFLAGS添加LTO优化参数重新编译时:make BOOT_CFLAGS='-march=native -O3 -flto=auto'
出现bootstrap对比失败,报错gcc/insn-emit.o文件不同,且stage-3目标文件大小约为stage-2的一半。
排查过程
- 初步怀疑调试信息差异,但对比阶段会自动剥离符号,手动添加
-g参数后问题仍存在; - 定位到问题根源:
-flto参数导致stage-2与stage-3的编译产物无法通过默认对比检查。
解决方案
在configure阶段添加--with-build-config=bootstrap-lto参数,完整配置命令:../gcc/configure --with-build-config=bootstrap-lto
该配置会自动启用LTO优化,同时移除部分导致对比失败的默认检查项,之后执行make -j8即可完成编译。
内容的提问来源于stack exchange,提问作者Gawhyr Ghun
相关产品推荐
相关产品推荐

