1

我正在尝试构建 GCC 4.7.3。当我使用非常旧的系统 GCC 4.1 构建它时,一切正常,我得到了 GCC 4.7.3。但是当我试图用刚刚编译的 GCC 4.7.3(实际上是自己构建)来重建它时,我遇到了 AS(GNU 汇编器)的麻烦。我将在不使用旧且有缺陷的系统编译器的情况下构建它。所有路径和所有库都是正确的(我检查过)。我可以构建所有先决条件。

但是当它开始构建 libgcc 时,它停留在检测 C 编译器上。

这是 config.log 的一部分,有错误:

configure:3335: checking for C compiler version
configure:3344: /root/build/tmp/gcc-build/./gcc/xgcc -B/root/build/tmp/gcc-build/./gcc/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/bin/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/lib/ -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/include -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/sys-include    --version >&5
xgcc (GCC) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

configure:3355: $? = 0
configure:3344: /root/build/tmp/gcc-build/./gcc/xgcc -B/root/build/tmp/gcc-build/./gcc/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/bin/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/lib/ -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/include -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/sys-include    -v >&5
Reading specs from /root/build/tmp/gcc-build/./gcc/specs
COLLECT_GCC=/root/build/tmp/gcc-build/./gcc/xgcc
COLLECT_LTO_WRAPPER=/root/build/tmp/gcc-build/./gcc/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ../../gcc-4.7.3/configure --prefix=/root/build/tmp/gcc --program-suffix=-4.7 --enable-static --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++ --disable-libssp --disable-multilib --disable-bootstrap --disable-lto --disable-tls --disable-nls --with-as=/root/build/gcc/bin/gcc --enable-version-specific-runtime-libs --with-host-libstdcxx=-lstdc++ --with-mpc=/root/build/tmp/mpc --with-mpfr=/root/build/tmp/mpfr --with-gmp=/root/build/tmp/gmp --with-ppl=/root/build/tmp/ppl --with-cloog=/root/build/tmp/cloog-ppl
Thread model: posix
gcc version 4.7.3 (GCC) 
configure:3355: $? = 0
configure:3344: /root/build/tmp/gcc-build/./gcc/xgcc -B/root/build/tmp/gcc-build/./gcc/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/bin/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/lib/ -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/include -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/sys-include    -V >&5
xgcc: error: unrecognized command line option '-V'
xgcc: fatal error: no input files
compilation terminated.
configure:3355: $? = 1
configure:3344: /root/build/tmp/gcc-build/./gcc/xgcc -B/root/build/tmp/gcc-build/./gcc/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/bin/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/lib/ -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/include -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/sys-include    -qversion >&5
xgcc: error: unrecognized command line option '-qversion'
xgcc: fatal error: no input files
compilation terminated.
configure:3355: $? = 1
configure:3371: /root/build/tmp/gcc-build/./gcc/xgcc -B/root/build/tmp/gcc-build/./gcc/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/bin/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/lib/ -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/include -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/sys-include    -o conftest -g -O2 -m32 -march=i686 -msse2 -mfpmath=sse   conftest.c  >&5
gcc: error: unrecognized command line option '--32'
configure:3374: $? = 1
configure:3562: checking for suffix of object files
configure:3584: /root/build/tmp/gcc-build/./gcc/xgcc -B/root/build/tmp/gcc-build/./gcc/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/bin/ -B/root/build/tmp/gcc/i686-pc-linux-gnu/lib/ -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/include -isystem /root/build/tmp/gcc/i686-pc-linux-gnu/sys-include    -c -g -O2 -m32 -march=i686 -msse2 -mfpmath=sse  conftest.c >&5
gcc: error: unrecognized command line option '--32'
configure:3588: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU C Runtime Library"
| #define PACKAGE_TARNAME "libgcc"
| #define PACKAGE_VERSION "1.0"
| #define PACKAGE_STRING "GNU C Runtime Library 1.0"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL "http://www.gnu.org/software/libgcc/"
| /* end confdefs.h.  */
| 
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:3602: error: in `/root/build/tmp/gcc-build/i686-pc-linux-gnu/libgcc':
configure:3605: error: cannot compute suffix of object files: cannot compile

问题是 xgcc (内部?)调用 GCC 作为带有 GNU AS 标志(例如 --32)的汇编程序,但我不使用 GNU AS!我只有 GCC 并且要使用它的汇编程序!在构建 libgcc 时,是否有任何配置选项或强制使用 GCC 汇编器的东西?我的 GCC 配置参数:

./configure \
  --prefix=$INST_DIR \
  --program-suffix=-4.7 \
  --enable-static \
  --enable-shared \
  --enable-threads=posix \
  --enable-__cxa_atexit \
  --enable-clocale=gnu \
  --enable-languages=c,c++ \
  --disable-libssp \
  --disable-multilib \
  --disable-bootstrap \
  --disable-lto \
  --disable-tls \
  --disable-nls \
  "--with-as=$GCC_DIR/bin/gcc" \
  --enable-version-specific-runtime-libs \
  --with-host-libstdcxx=-lstdc++ \
  "--with-mpc=$MPC_INST_DIR" \
  "--with-mpfr=$MPFR_INST_DIR" \
  "--with-gmp=$GMP_INST_DIR" \
  "--with-ppl=$PPL_INST_DIR" \
  "--with-cloog=$CLOOG_INST_DIR"

正如您在构建 GCC 本身时所看到的那样,我通过“--with-as=”命令强制使用 GCC 作为汇编程序。但是我怎么能在 GCC 内部 libgcc 编译阶段做到这一点呢?还是 GCC 依赖于 GNU AS 汇编器?

笔记:

xgcc 调用调用汇编程序的“as”脚本。在我的情况下,'as' 有字符串: ORIGINAL_AS_FOR_TARGET="/build/gcc/bin/gcc" 并且应该使用 GCC 作为汇编程序。但是 xgcc 使用 GNU AS 特定的参数调用它。

4

2 回答 2

0

您很可能(在 Linux 上)安装了 GNUas汇编器,/usr/bin/as因此您应该配置

 "--with-as=/usr/bin/as" 

(我所知道的大多数 x86-64 Linux 系统都有一个 GNU as - 它接受 32 位和 64 位指令和指令)。

此外,除非配置--disable-bootstrap了(非交叉编译器)GCC 构建是自举的:它自己重新编译自己。

顺便说一句,gcc-help@gcc.gnu.org可能是询问此类非常 GCC 特定问题的更好地方。

最后,这些天(2014 年 4 月中旬)发布了 GCC 4.9。更好地编译这个版本(或者至少是 GCC 4.8.2)而不是旧的 GCC 4.7.3

于 2014-04-17T11:54:43.623 回答
0

正如我发现的那样——是的,GCC 依赖于 binutils 和 AS/LD 工具。因此,如果您尝试在非常旧或损坏的系统上构建现代 GCC,您可能还需要构建 binutils。并且与现代 GCC 和较旧的 binutils 存在一些非关键但令人讨厌的小不兼容。好消息是,如果 binutils 位于他的源代码树的顶部,GCC 可以自己构建它们 - 互联网上有很多关于此的示例。或者您必须手动构建它们并为 GCC 设置环境。

于 2014-04-25T08:25:41.997 回答