$Id$
out of memory allocating 4072 bytes after a total of 134166588 bytes
ulimit(3) 制限に引っかかってしまっている。
limit datasize unlimited (cshの場合) を実行してからmakeする。
なお、GCCをコンパイルする際は実メモリは 最低 192MB は欲しい。 コンパイル途中で実行される genautomata が155MB近くのメモリを消費するため。
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 でインストールされている場所を明示する。
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 でインストールされている場所を明示する。
/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 を展開する。
/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 ライブラリを陽に要求しているため かもしれない。
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 には載っていない。
新しい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として
-Wl,-path,/usr/local/gcc4/lib
を追加する (libgcc_s.soを使う)
-static-libgcc
を追加する (libgcc.a を使う)
GCCそのものの ./configure オプションで --enable-shared=libstdc++,libssp と、libgcc を外せば libgcc_s.so は作られなくなるので a.out はlibgcc.a のみ使うようになるが、 C++のcatch/throwは正常に使えなくなる。はず。