▼GCC 4.7.4 を自分でコンパイルした際のハマり所▼

$Id$


メモリ不足

out of memory allocating 4072 bytes after a total of 134166588 bytes

原因

ulimit(3) 制限に引っかかってしまっている。

解決法

limit datasize unlimited (cshの場合) を実行してからmakeする。

なお、GCCをコンパイルする際は実メモリは 最低 192MB は欲しい。 コンパイル途中で実行される genautomata が155MB近くのメモリを消費するため。


mpfr.hが見つからない

gcc -c   -g -DIN_GCC   -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes   -fno-common  -DHAVE_CONFIG_H -I. -I. -I../.././gcc -I../.././gcc/. -I../.././gcc/../include -I../.././gcc/../libcpp/include -I/export/localsrc/gcc-4.7.4/host-i386-unknown-netbsdelf1.6.2/gmp -I/export/localsrc/gcc-4.7.4/gmp  -I../.././gcc/../libdecnumber -I../.././gcc/../libdecnumber/dpd -I../libdecnumber    ../.././gcc/builtins.c -o builtins.o
In file included from ../.././gcc/builtins.c:29:
../../gcc/realmpfr.h:26: mpfr.h: No such file or directory
../../gcc/realmpfr.h:27: mpc.h: No such file or directory
gmake[3]: *** [builtins.o] Error 1

原因

依存関係の gmp, mpfr ライブラリは ./gcc と同じディレクトリに置いておけば gcc と共にコンパイルできると INSTALL/prerequisites.html に書いてあるが、 実際にはできない模様。 あらかじめ、gmp と mpfr ライブラリはインストールしておく必要がある。 この2つはコンパイル自体はすぐ終わるので、 先にインストールしておくほうが効率がいい。 (しかしmake checkには数時間かかる…)

また、mpfr を同梱コンパイルしようとしていったん ./mpfr -> な シンボリックリンクをつくり make に失敗したあと、 ./mpfr を削除しても ./host-i386-* を掃除しないまま make を再実行すると 同じエラーが出る。再実行する際は make distclean で完全に掃除してから ./configure しなおすほうが安全。

解決法

mpfr (と、依存関係のgmp) ライブラリは、あらかじめインストールしておく。 その上で ./configure --with-mpfr=/usr/local/gcc4 --with-gmp=/usr/local/gcc4 でインストールされている場所を明示する。


libmpfr が見つからない

Configuring stage 1 in host-i386-unknown-netbsdelf1.6.2/mpc
...
checking for MPFR... no
configure: error: libmpfr not found or uses a different ABI (including static vs shared).

原因

同上。mpfr ライブラリは、gccと同時にはコンパイルできない模様。

解決法

mpfr (と、依存関係のgmp) ライブラリは、あらかじめインストールしておく。 その上で ./configure --with-mpfr=/usr/local/gcc4 --with-gmp=/usr/local/gcc4 でインストールされている場所を明示する。


hash_load_check_resize_trigger_imp.hpp が見つからない

/export/localsrc/gcc-4.7.4/host-i386-unknown-netbsdelf1.6.2/gcc/xgcc -shared-libgcc -B/export/localsrc/gcc-4.7.4/host-i386-unknown-netbsdelf1.6.2/gcc -nostdinc++ -L/export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/src -L/export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/src/.libs -B/usr/local/gcc4/i386-unknown-netbsdelf1.6.2/bin/ -B/usr/local/gcc4/i386-unknown-netbsdelf1.6.2/lib/ -isystem /usr/local/gcc4/i386-unknown-netbsdelf1.6.2/include -isystem /usr/local/gcc4/i386-unknown-netbsdelf1.6.2/sys-include    -x c++-header -nostdinc++ -g -O2 -I/export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/include/i386-unknown-netbsdelf1.6.2 -I/export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/include -I/export/localsrc/gcc-4.7.4/libstdc++-v3/libsupc++ -O2 -g /export/localsrc/gcc-4.7.4/libstdc++-v3/include/precompiled/extc++.h -o i386-unknown-netbsdelf1.6.2/bits/extc++.h.gch/O2g.gch
In file included from /export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/include/ext/pb_ds/detail/standard_policies.hpp:45:0,
	 from /export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/include/ext/pb_ds/assoc_container.hpp:47,
	  from /export/localsrc/gcc-4.7.4/libstdc++-v3/include/precompiled/extc++.h:60:
/export/localsrc/gcc-4.7.4/i386-unknown-netbsdelf1.6.2/libstdc++-v3/include/ext/pb_ds/hash_policy.hpp:281:81: fatal error: ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hpp: No such file or directory
compilation terminated.
gmake[5]: *** [i386-unknown-netbsdelf1.6.2/bits/extc++.h.gch/O2g.gch] Error 1

原因

展開されたファイルが、 libstdc++-v3/include/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hp と、最後の文字が切れている。 これは GNU tar 1.12 以前のバグというか仕様というか。 99文字でファイル名が途切れてしまうバグがある。

解決法

INSTALL/prerequistes.html にも載っている、 GNU tar 1.14 以降を使って gcc-4.7.4.tar.bz2 を展開する。


Error: bignum invalid; zero assumed

/export/localsrc/gcc-4.7.4/host-i386-unknown-netbsdelf1.6.2/prev-gcc/xgcc -B/export/localsrc/gcc-4.7.4/host-i386-unknown-netbsdelf1.6.2/prev-gcc/ -B/usr/local/gcc4/i386-unknown-netbsdelf1.6.2/bin/ -B/usr/local/gcc4/i386-unknown-netbsdelf1.6.2/bin/ -B/usr/local/gcc4/i386-unknown-netbsdelf1.6.2/lib/ -isystem /usr/local/gcc4/i386-unknown-netbsdelf1.6.2/include -isystem /usr/local/gcc4/i386-unknown-netbsdelf1.6.2/sys-include    -c   -g -O2 -DIN_GCC   -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Wold-style-definition -Wc++-compat   -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../.././gcc -I../.././gcc/build -I../.././gcc/../include -I../.././gcc/../libcpp/include -I/usr/local/gcc4/include -I/usr/local/gcc4/include -I/export/localsrc/gcc-4.7.4/mpc/src  -I../.././gcc/../libdecnumber -I../.././gcc/../libdecnumber/dpd -I../libdecnumber    \
        -o build/genrecog.o ../.././gcc/genrecog.c
/var/tmp/ccrPamLA.s: Assembler messages:
/var/tmp/ccrPamLA.s:16940: Error: bignum invalid; zero assumed
/var/tmp/ccrPamLA.s:16950: Error: bignum invalid; zero assumed
/var/tmp/ccrPamLA.s:16956: Error: bignum invalid; zero assumed
gmake[3]: *** [build/genrecog.o] Error 1
gmake[3]: Leaving directory `/export/localsrc/gcc-4.7.4/host-i386-unknown-netbsdelf1.6.2/gcc'
gmake[2]: *** [all-stage3-gcc] Error 2
gmake[2]: Leaving directory `/export/localsrc/gcc-4.7.4'

原因

アセンブラ出力の

.sleb128 -9223372036854775808 (0x8000000000000000)
がアセンブルできない。

解決法

新しい binutils (gas) をインストールする。
INSTALL/prerequisites.html や INSTALL/specific.html には どの辺の binutils が必要かの明示がないが、binutils 2.19 あたり以上を インストールしておく。 コンパイルに gmp, mpfr ライブラリを要求するバージョンが目安。
その上で、 ./configure --with-as=/usr/local/gcc4/bin/as と、使うアセンブラを変更する。

GCCで mpfr ライブラリの同梱コンパイルが ろくにテストされていないのは、 前提となる gas が mpfr ライブラリを陽に要求しているため かもしれない。

libitmのconfigureに失敗

Checking multilib configuration for libitm...
...
checking whether byte ordering is bigendian... no
configure: error: Pthreads are required to build libitm
gmake[1]: *** [configure-target-libitm] Error 1
gmake[1]: Leaving directory `/export/localsrc/gcc-4.7.4'

解決法

./configure --disable-libitm を追加する。 このオプションは INSTALL/configure.html には載っていない。


出力が libgcc_s.so に依存している

新しいgccがコンパイルできたので、使ってみる。

% /usr/local/gcc4/bin/gcc a.c
% ldd a.out
a.out:
	 -lgcc_s.1 => not found
	 -lc.12 => /usr/lib/libc.so.12

原因

GCC では C++ のcatch/throw を共有ライブラリ間で使うときは libgcc_s.so とリンクする必要がある ので、デフォルトでは(Cでも)そうなっている。 libgcc_s.a にはできない

で、a.out の RPATH にlibgcc_s.soのあるディレクトリが設定されていないと 実行時ダイナミックリンカが失敗する。

解決法

GCCコンパイル時ではなく、gcc使用時やconfigureのLDFLAGSとして

GCCそのものの ./configure オプションで --enable-shared=libstdc++,libssp と、libgcc を外せば libgcc_s.so は作られなくなるので a.out はlibgcc.a のみ使うようになるが、 C++のcatch/throwは正常に使えなくなる。はず。


かべ@sra-tohoku.co.jp