[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下に、GCC のインストール過程で発生する問題(それに実際には何も 間違いではない見かけ上の問題)の一覧を示す。
CC
のような環境変数を定義すると、
make
の機能と干渉を起こすことがある。
fixincludes
を実行中に
問題が発生する可能性がある。
この問題により結果的に、‘sys/types.h’ の中の size_t
の
宣言の修正に失敗する。size_t
が符号付きの型になっていて
そのために型の不一致のエラーが起こったら、これが原因である。
この問題を回避するには、GCC を構築するのに、 System V のファイルシステム上のディレクトリを使わないことである。
gcc
は、
as
や ld
を色々な場所から探した。
例えば、‘/usr/local/lib/gcc-’ で始まるファイル等から。
GCC のバージョン 2 では、
‘/usr/local/lib/gcc-lib/target/version’ という
ディレクトリを探すようになっている。
つまり、システムのデフォルト以外のバージョンの as
や ld
、
例えば gas
や GNU ld
を使いたければ、それを
上記のディレクトリに置いておく必要がある。(あるいは、リンクを張っておく。)
make
が
その失敗を無視することがある。
こういう失敗は、ファイルが見つからない場合に良く起こり、予想されている
ことなので、無視しても大丈夫である。
make
がコンパイラの一部を
再コンパイルすることが時々ある。
ある場合には、make
のバグに起因することがある。
その場合は、この問題を無視するか GNU Make を使うようにすれば良い。
enquire
を
リンクするときにエラーが起きるかもしれない。
enquire
のリンクは、GCC の構築過程の一部である。
これを避けるには、purify がインストールする real-ld
というファイル
を取り除くことである。そうすれば、GCC は purify を使おうとしない。
__GNU_LIBRARY__
の条件を
‘#if 1’ に変えれば良い。
enquire
が、マザーボードのハードウェア障害のために
ハングしてしまうからである。ハードウェア障害というのは、
浮動小数点例外をカーネルに不正確に伝えるというものである。
enquire
を実行するコマンドを取り除くことで、‘float.h’ なしで
GCC をインストールすることもできる。
本当に問題を解決したのなら、マザーボードを取り替えるのが良いだろう。
この問題は、Micronics のマザーボードの Revision E で見つかっており、
Revision F では修正されている。
また、MYLEX MAX-33 のマザーボードでも見つかっている。
この問題に出会ったら、コンパイルを実行している間、ソケットから FPU を取り外しておくことも考えても良いだろう。 あるいは、SCO Unix を使っているなら、リブートして強制的に FPU を 無視するようにすることもできる。それには、‘hd(40)unix auto ignorefpu’ と入力する。
こういうシステムの一つは、Interactive Systems の Unix である 386/ix である。 このシステムには、別のエミュレータも提供されており、そちらは正しく動作する。 それを使うためには、以下のコマンドをスーパーユーザで実行する。
ln /etc/emulator.rel1 /etc/emulator |
次にシステムをリブートする。 (デフォルトのエミュレータファイルは、‘emulator.dflt’ という名前で 残っている。)
この問題が SCO のシステムで起きたときは、 ‘/etc/emulator.att’ を使ってみて欲しい。
この問題のあるもう一つ別のシステムは、Esix である。 正しく動作するエミュレータが別にあるかどうか我々は知らない。
NetBSD 0.8 では、同様の問題により以下のようなエラーメッセージが出る。
enquire.c: In function `fprop': enquire.c:2328: floating overflow |
genflags
や genoutput
と言ったプログラムが落ちることがある。
これは、sh
のバグのせいだと言われている。
おそらく、genflags
や genoutput
を手動で実行して、
もう一度 make
を実行することで回避できると思われる。
解決策は、GCC の現行バージョンは ‘-g’ なしでコンパイルする ことである。こうすると正しく動作するコンパイラができるので、 それを使って ‘-g’ を付けて再コンパイルすれば良い。
あるオプションのパッケージがインストールされているかどうかを
確かめるには、pkginfo
コマンドを使う。あるオプションパッケージを
追加するには、pkgadd
コマンドを使う。さらに詳しいことについては
Solaris のドキュメントを参照のこと。
Solaris 2.0 と 2.1 の場合は、GCC は次の 6 個のパッケージが必要である。 ‘SUNWarc’、‘SUNWbtool’、‘SUNWesu’、‘SUNWhea’, ‘SUNWlibm’、‘SUNWtoo’。
Solaris 2.2 の場合は、さらに 7 番目のパッケージ ‘SUNWsprot’ が ひつようになる。
PATH
から ‘/usr/ucb’ を取り除く。
add.d
のような、
浮動小数点命令で埋めたといってアセンブラが文句を言ってくる。
GAS が gp テーブルを生成するようにすれば良いのだろうが、これは 無くても良いものなので、無いからと言って警告を出すべきではないのである。
fixincludes
で
修正しないうちは、GCC では全く使えない。これは、GCC を構築するときに
問題になり、GCC を一旦インストールしてしまえば問題はなくなる。
この問題を回避するには、ステージ 1 コンパイラを作るときに、make に 以下のオプションを指定する。
GCC_FOR_TARGET="./xgcc -B./ -I./include" |
ステージ 2 と 3 を作るときには、以下のように指定する。
CFLAGS="-g -I./include" |
RISC/os 4.x と共に出荷された MIPS のバージョン 2.20 の コンパイラツールには幾つか問題があるとの報告もユーザから上がっている。 バージョン 2.11 以前なら正しく動作するようである。
alloca
を使っているコードを
RISC/OS 5.0 と DEC の OSF/1 の共有ライブラリとリンクするときに
アサーションに失敗する。これはリンカのバグであり、将来のバージョンでは
修正されるものと思われる。これを避けるために、ユーザが明示的に
‘-shared’ や ‘-call_shared’ を指定しない限り、GCC は
リンカに ‘-non_shared’ を渡す。
ld fatal: failed to write symbol name something in strings table for file whatever |
これは恐らく、ディスクが一杯になってしまったか、ULIMIT の設定のために 必要な大きさのファイルが作れないということを示している。
この問題は、カーネルのパラメータ MAXUMEM
が小さすぎても
起こる。その場合、カーネルを作り直して、この値をもっと大きくしなければ
ならない。デフォルト値は 1024 であるという報告が来ている。
32768 だと動作するようだ。これより小さくても動くかもしれない。
/usr/local/lib/bison.simple: In function `yyparse': /usr/local/lib/bison.simple:625: virtual memory exhausted |
というエラーが出たら、ディスク容量、ULIMIT あるいは MAXUMEM
の
問題であることを表している。
これを回避するには、カーネルを再構成して、構成ファイルに以下の行を 追加する。
MAXUMEM = 4096 |
_floatdisf cc1: warning: `-g' option not supported on this version of GCC cc1: warning: `-g1' option not supported on this version of GCC ./xgcc: Internal compiler error: program as got fatal signal 11 |
修正済みのアセンブラは、altdorf.ai.mit.edu
の
‘archive/cph/hpux-8.0-assembler’ にあり、匿名 ftp で
入手できる。HP のソフトウェアサポートを受けているなら、
パッチを HP から、以下の注意書きにあるように直接入手できる。
This is the patched assembler, to patch SR#1653-010439, where the assembler aborts on floating point constants.
The bug is not really in the assembler, but in the shared library version of the function “cvtnum(3c)”. The bug on “cvtnum(3c)” is SR#4701-078451. Anyway, the attached assembler uses the archive library version of “cvtnum(3c)” and thus does not exhibit the bug.
このパッチは PHCO_4484 としても知られている。
fixproto
を
実行すると、システムのシェルのバグを引き出す。
これは、8.07 以降のバージョンでは発生しない。
この問題に出会ったら、OS をアップグレードするか、fixproto
を
実行するのに BASH (GNU のシェル)を使えば良い。
muldi3
をコンパイルするときに GCC が落ちるかどうかで
判る。
GCC のバージョン 1 を入手、インストールして、それを使って GCC のバージョン 2 をコンパイルするとうまく行くはずである。 この、Pyramid の C コンパイラのバグは、GCC のバージョン 1 には 影響しないようなので。
va_arg
を
二重定義しているという警告かエラーが出る。
そうなった場合、ほとんどのプログラムは、ライブラリ ‘iclib.a’ を リンクする必要がある。また、‘stdio.h’ を以下のように 修正しなければならない。
#if defined(__i860__) && !defined(_VA_LIST) #include <va_list.h> |
という行の前に以下の行を挿入する。
#if __PGC__ |
そして、
extern int vprintf(const char *, va_list ); extern int vsprintf(char *, const char *, va_list ); #endif |
という行の後に
#endif /* __PGC__ */ |
という行を追加する。 この問題は、OS のバージョン 1.1 には存在しない。
./fixproto: sh internal 1K buffer overflow |
これを回避するには、シェルスクリプト fixproto の先頭の行を 以下のように変えれば良い。
#!/bin/ksh |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated
using texi2html 1.78.