hnwの日記

MacPortsからインストールしたgccについて混乱中

先日の記事「Xcodeのgcc-3.3の件」の続きです。Xcodegcc-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 まだβリリースですけどね


そもそも僕が何故こんなことを始めたかというと、MacOSXPHP 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側の問題のような気もするのですが、一方でXcodegcc 4.0で作ったPHP 5.0.5(mbstringなし)では上記のprintfが正しく実行できたりして、やっぱりgccが悪いのかなあ、などと混乱中です。


もう何が何やらわからないのですが、怖いから標準のgccだけ使ってろという結論で良いですかね?何か情報をお持ちの方がいらしたら教えてください。

*1:php-5.2.6のmake testで失敗したテスト数、ちなみにXcodeのgcc4.0でも40/4292。localeまわりのテストが共通で失敗してます