为什么 GCC bootstrap 后我的 stage-2 和 stage-3 不同

问题描述 投票:0回答:0

我最近从官方 git 存储库开始自己构建 gcc。我正在使用 Arch Linux,并从官方存储库安装了所有必要的库。我做了以下事情:

  1. 从 git://gcc.gnu.org/git/gcc.git 克隆 gcc 源
  2. 签出标签发布/gcc-12.2.0
  3. 在 gcc sourcetree 之外创建单独的目录
  4. 在没有任何附加参数的情况下运行 ../gcc/configure
  5. 运行 make -j8(只是为了加快进程)

完成这些步骤后,构建过程顺利完成,比较过程中没有任何错误。第 2 阶段和第 3 阶段似乎是相同的。然而,当我重复这个过程时,这次是:

  1. 使 BOOT_CFLAGS='-march=native -O3 -flto=auto'

结果第 2 阶段和第 3 阶段的大小差异很大(第 3 阶段的对象通常比第 2 阶段小 2 倍),因此比较步骤失败。确切的输出是:

make "DESTDIR=" "RPATH_ENVVAR=LD_LIBRARY_PATH" "TARGET_SUBDIR=x86_64-pc-linux-gnu" "bindir=/usr/local/bin" "datadir=/usr/local/share" "exec_prefix=/usr/local" "includedir=/usr/local/include" "datarootdir=/usr/local/share" "docdir=/usr/local/share/doc/" "infodir=/usr/local/share/info" "pdfdir=/usr/local/share/doc/" "htmldir=/usr/local/share/doc/" "libdir=/usr/local/lib" "libexecdir=/usr/local/libexec" "lispdir=" "localstatedir=/usr/local/var" "mandir=/usr/local/share/man" "oldincludedir=/usr/include" "prefix=/usr/local" "sbindir=/usr/local/sbin" "sharedstatedir=/usr/local/com" "sysconfdir=/usr/local/etc" "tooldir=/usr/local/x86_64-pc-linux-gnu" "build_tooldir=/usr/local/x86_64-pc-linux-gnu" "target_alias=x86_64-pc-linux-gnu" "AWK=gawk" "BISON=bison" "CC_FOR_BUILD=gcc" "CFLAGS_FOR_BUILD=-g -O2" "CXX_FOR_BUILD=g++ -std=c++11" "EXPECT=expect" "FLEX=flex" "INSTALL=/usr/bin/install -c" "INSTALL_DATA=/usr/bin/install -c -m 644" "INSTALL_PROGRAM=/usr/bin/install -c" "INSTALL_SCRIPT=/usr/bin/install -c" "LDFLAGS_FOR_BUILD=" "LEX=flex" "M4=m4" "MAKE=make" "RUNTEST=runtest" "RUNTESTFLAGS=" "SED=/usr/bin/sed" "SHELL=/bin/sh" "YACC=bison -y" "`echo 'ADAFLAGS=' | sed -e s'/[^=][^=]*=$/XFOO=/'`" "ADA_CFLAGS=" "AR_FLAGS=rc" "echo 'BOOT_ADAFLAGS=-gnatpg' | sed -e s'/[^=][^=]*=$/XFOO=/'" "BOOT_CFLAGS=-march=native -O3 -flto=auto" "BOOT_LDFLAGS=" "CFLAGS=-g -O2    " "CXXFLAGS=-g -O2    " "LDFLAGS=" "LIBCFLAGS=-g -O2  " "LIBCXXFLAGS=-g -O2   -fno-implicit-templates" "STAGE1_CHECKING=--enable-checking=yes,types" "STAGE1_LANGUAGES=c,c++,lto" "GNATBIND=gnatbind" "GNATMAKE=gnatmake" "GDC=gdc" "GDCFLAGS=-g -O2  " "AR_FOR_TARGET=ar" "AS_FOR_TARGET=as" "CC_FOR_TARGET=/home/urquelle/git/build/./gcc/xgcc -B/home/urquelle/git/build/./gcc/" "CFLAGS_FOR_TARGET=-g -O2" "CPPFLAGS_FOR_TARGET=" "CXXFLAGS_FOR_TARGET=-g -O2 -D_GNU_SOURCE" "DLLTOOL_FOR_TARGET=dlltool" "DSYMUTIL_FOR_TARGET=dsymutil" "FLAGS_FOR_TARGET=-B/usr/local/x86_64-pc-linux-gnu/bin/ -B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem /usr/local/x86_64-pc-linux-gnu/include -isystem /usr/local/x86_64-pc-linux-gnu/sys-include" "GFORTRAN_FOR_TARGET=/home/urquelle/git/build/./gcc/gfortran -B/home/urquelle/git/build/./gcc/" "GOC_FOR_TARGET=" "GOCFLAGS_FOR_TARGET=-O2 -g" "GDC_FOR_TARGET=gdc" "GDCFLAGS_FOR_TARGET=-O2 -g" "LD_FOR_TARGET=ld" "LIPO_FOR_TARGET=lipo" "LDFLAGS_FOR_TARGET=" "LIBCFLAGS_FOR_TARGET=-g -O2" "LIBCXXFLAGS_FOR_TARGET=-g -O2 -D_GNU_SOURCE -fno-implicit-templates" "NM_FOR_TARGET=nm" "OBJDUMP_FOR_TARGET=objdump" "OBJCOPY_FOR_TARGET=" "RANLIB_FOR_TARGET=ranlib" "READELF_FOR_TARGET=readelf" "STRIP_FOR_TARGET=strip" "WINDRES_FOR_TARGET=windres" "WINDMC_FOR_TARGET=windmc" "BUILD_CONFIG=bootstrap-debug" "echo 'LANGUAGES=' | sed -e s'/[^=][^=]*=$/XFOO=/'" "LEAN=false" "STAGE1_CFLAGS=-g" "STAGE1_CXXFLAGS=-g" "STAGE1_GENERATOR_CFLAGS=" "STAGE1_TFLAGS=-fno-checking" "STAGE2_CFLAGS=-march=native -O3 -flto=auto -fno-checking -gtoggle" "STAGE2_CXXFLAGS=-march=native -O3 -flto=auto -fno-checking -gtoggle" "STAGE2_GENERATOR_CFLAGS=" "STAGE2_TFLAGS=-fno-checking" "STAGE3_CFLAGS=-march=native -O3 -flto=auto -fchecking=1" "STAGE3_CXXFLAGS=-march=native -O3 -flto=auto -fchecking=1" "STAGE3_GENERATOR_CFLAGS=" "STAGE3_TFLAGS=-fchecking=1" "STAGE4_CFLAGS=-march=native -O3 -flto=auto" "STAGE4_CXXFLAGS=-march=native -O3 -flto=auto" "STAGE4_GENERATOR_CFLAGS=" "STAGE4_TFLAGS=" "STAGEprofile_CFLAGS=-march=native -O3 -flto=auto -fno-checking -gtoggle -fprofile-generate" "STAGEprofile_CXXFLAGS=-march=native -O3 -flto=auto -fno-checking -gtoggle -fprofile-generate" "STAGEprofile_GENERATOR_CFLAGS=" "STAGEprofile_TFLAGS=-fno-checking" "STAGEtrain_CFLAGS=-march=native -O3 -flto=auto" "STAGEtrain_CXXFLAGS=-march=native -O3 -flto=auto" "STAGEtrain_GENERATOR_CFLAGS=" "STAGEtrain_TFLAGS=" "STAGEfeedback_CFLAGS=-march=native -O3 -flto=auto -fprofile-use -fprofile-reproducible=parallel-runs" "STAGEfeedback_CXXFLAGS=-march=native -O3 -flto=auto -fprofile-use -fprofile-reproducible=parallel-runs" "STAGEfeedback_GENERATOR_CFLAGS=" "STAGEfeedback_TFLAGS=" "STAGEautoprofile_CFLAGS=-march=native -O3 -flto=auto -fno-checking -gtoggle -g" "STAGEautoprofile_CXXFLAGS=-march=native -O3 -flto=auto -fno-checking -gtoggle -g" "STAGEautoprofile_GENERATOR_CFLAGS=" "STAGEautoprofile_TFLAGS=-fno-checking" "STAGEautofeedback_CFLAGS=-march=native -O3 -flto=auto -fchecking=1" "STAGEautofeedback_CXXFLAGS=-march=native -O3 -flto=auto -fchecking=1" "STAGEautofeedback_GENERATOR_CFLAGS=" "STAGEautofeedback_TFLAGS=-fchecking=1" "CXX_FOR_TARGET= $r/./gcc/xg++ -B$r/./gcc/ -nostdinc++ if test -f $r/x86_64-pc-linux-gnu/libstdc++-v3/scripts/testsuite_flags; then /bin/sh $r/x86_64-pc-linux-gnu/libstdc++-v3/scripts/testsuite_flags --build-includes; else echo -funconfigured-libstdc++-v3 ; fi -L$r/x86_64-pc-linux-gnu/libstdc++-v3/src -L$r/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs -L$r/x86_64-pc-linux-gnu/libstdc++-v3/libsupc++/.libs" "TFLAGS=" "CONFIG_SHELL=/bin/sh" "MAKEINFO=makeinfo --split-size=5000000 --split-size=5000000"  compare

make[2]: Entering directory '/home/urquelle/git/build'\
make[3]: Entering directory '/home/urquelle/git/build'\
rm -f stage_current\
make[3]: Leaving directory '/home/urquelle/git/build'\
Comparing stages 2 and 3\
Bootstrap comparison failure!\
gcc/insn-emit.o differs\
make[2]: *** [Makefile:27165: compare] Error 1\
make[2]: Leaving directory '/home/urquelle/git/build'\
make[1]: *** [Makefile:27145: stage3-bubble] Error 2\
make[1]: Leaving directory '/home/urquelle/git/build'\
make: *** [Makefile:1072: all] Error 2

我期待两个阶段完全相同,二进制明智。我并没有真正尝试太多,因为我不知道从哪里开始。我非常感谢任何人指出我正确的方向。

更新 1:

经过进一步调查,我发现对象大小的差异可以(至少部分地)通过在阶段 2 中包含调试信息来解释,根据:https://gcc.gnu.org/install/build。 html,因为 make 默认为 bootstrap-debug.

但是,该指令还声称(这在我包含的输出中得到了进一步证实)结果对象将在比较过程中去除其调试符号。此外,我明确地测试了手动添加 -g 开关到 BOOT_CFLAGS 的构建,只是为了得到我之前的结果(在 insn-emit.o 上比较失败)。

更新 2:

我试过使用其他标志排列进行构建,得出的结论是 -flto 开关导致构建失败。我仍然不知道为什么会这样,因为根据手册,这是构建 GCC 的合法方式。

解决方案:

我设法自己解决了这个问题。显然,一些默认的比较检查在默认的 bootstrap-debug 配置上被破坏了。解决方案是显式配置 --with-build-config=bootstrap-lto。与手册所说的相反,这不仅等同于将 -flto 添加到 BOOT_CFLAGS,而且还删除了生成的 makefile 中的一些比较检查。希望这对以后遇到这个问题的任何人都有帮助。

linux gcc makefile build compiler-optimization
© www.soinside.com 2019 - 2024. All rights reserved.