MacPortsからインストールしたgccについて混乱中
先日の記事「Xcodeのgcc-3.3の件」の続きです。Xcodeのgcc-3.3はイマイチ期待していたものと違ったので、MacPortsに期待してみることにしましょう。Macportsにはgccらしきものがたくさんあります。本記事執筆時点で下記のような状況です。
パッケージ名 | バイナリ名 | 正常動作 | テスト失敗率*1 | 備考(2分くらい触った感想) |
---|---|---|---|---|
apple-gcc33 | gcc-apple-3.3 | △? | 19/4292 | リンク時に「indirect jmp without `*'」と言われるのが怪しい / php-5.0.xのコンパイルは通るが、出来たバイナリの挙動があやしい |
apple-gcc40 | gcc-apple-4.0 | ○ | 19/4292 | - |
apple-gcc42 | gcc-apple-4.2 | ○ | 40/4292 | - |
gcc33 | - | × | - | パッケージのインストールが失敗する |
gcc34 | - | × | - | パッケージのインストールが失敗する |
gcc40 | - | × | - | パッケージのインストールが失敗する |
gcc41 | gcc-mp-4.1 | ○ | 20/4292 | リンク時に「indirect jmp without `*'」と言われるのが怪しい |
gcc42 | gcc-mp-4.2 | ○ | 21/4292 | - |
gcc43 | gcc-mp-4.3 | ○ | 42/4292 | - |
gcc44 | gcc-mp-4.4 | ○ | 42/4292 | まだβリリースですけどね |
そもそも僕が何故こんなことを始めたかというと、MacOSXでPHP 5.0.xをコンパイルしようと思ったんですね。ただ、この頃のPHP(というか当時の鬼車)がvarargs.hをincludeしているせいで、gcc 4.x系では下記のようなエラーが出てコンパイルできないんです。で、gcc 3.xを探していたというわけです。
/usr/lib/gcc/i686-apple-darwin8/4.0.1/include/varargs.h:4:2: error: #error "GCC no longer implements <varargs.h>." /usr/lib/gcc/i686-apple-darwin8/4.0.1/include/varargs.h:5:2: error: #error "Revise your code to use <stdarg.h>."
ところがマトモに動くgcc3.xはapple-gcc33の1個だけしか手に入らない上に、リンク時に怖そうなwarning「indirect jmp without `*'」が出ます。これ、何なんでしょうね?しかも、PHP-5.0.xをコンパイルすると、一見動いているんですが、時々bus errorで落ちます。
$ php-5.0.5 -r 'printf("%e\n", 3e300);' zsh: bus error php-5.0.5 -r 'printf("%e\n", 3e300);'
apple-gcc33で作ったPHP 5.2.6ではこんな問題は起きないので、PHP側の問題のような気もするのですが、一方でXcodeのgcc 4.0で作ったPHP 5.0.5(mbstringなし)では上記のprintfが正しく実行できたりして、やっぱりgccが悪いのかなあ、などと混乱中です。
もう何が何やらわからないのですが、怖いから標準のgccだけ使ってろという結論で良いですかね?何か情報をお持ちの方がいらしたら教えてください。