2008年11月24日月曜日

Ulrichお前か〜

はなぽんさんがご指摘のFedora 9でKamikaze 7.09のイメージがビルドできない問題ですが,こちらでもFedora 9の環境を作って試したところ完全に再現しました。確かに「build_mips/linux/scripts/mod/sumversion.c」のビルド時に「PATH_MAX」の未定義エラーで終了します onz。こりゃまた訂正記事ものです。ただ私がテストしたFedora 8では何の問題もなくビルドできるんですよねぇ。


訂正記事を書くにも原因を調査せねばなりません。コンパイル済みのファイルをfileコマンドで調べてみると,どうやらbuild_mips/linux/scripts以下のファイルはクロス・コンパイラではなく,システム・コンパイラを使ってビルドされているようです。そのためシステム環境によって違いがでるわけですね。cppコマンドを使って,sumversion.cのコンパイル時に読み込まれるヘッダーを調査します。Fedora 8(x86_64)での実行結果から肝になる部分を抜き出すと次のようになります。


# 1 "/usr/include/bits/socket.h" 1 3 4
# 30 "/usr/include/bits/socket.h" 3 4
# 1 "/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/stddef.h" 1 3 4
# 31 "/usr/include/bits/socket.h" 2 3 4

# 1 "/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/limits.h" 1 3 4
# 11 "/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/limits.h" 3 4
# 1 "/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/syslimits.h" 1 3 4

GCC付属のlimits.hから始まって,各種限界値を表すマクロを定義したヘッダーが読み込まれています。これをずっとたどっていくと「PATH_MAX」を定義している「linux/limits.h」が読み込まれるわけです。一方,Fedora 9(i386)で同じことをやった結果が次です。


# 1 "/usr/include/bits/socket.h" 1 3 4
# 29 "/usr/include/bits/socket.h" 3 4
# 1 "/usr/lib/gcc/i386-redhat-linux/4.3.0/include/stddef.h" 1 3 4
# 30 "/usr/include/bits/socket.h" 2 3 4

つまり/usr/include/bits/socket.hに何らかの変更があって,limits.hヘッダーが読み込まれていないことが分かります。実際にsocket.hを調べるとFedora 8のものにはあった「#include <limits.h>」という行が,Fedora 9にはありません。glibcのgitツリーを調べると,2008年1月16日にglibcの中心開発者Ulrich Drepper氏が「Cleanup namespace」というコメント付きでこの変更を加えていることが分かります(差分情報)。つまり悪いのはUlrichです(違)。


カーネルの方も2.6.22以降ではこの変更に対応しているのですが,不幸なことにKamikaze 7.09のカーネルは2.6.21.5。それでFedora 9環境ではエラーになるわけです。Fedora 9だけでなく,上記の変更が取り込まれたglibc-2.8以降を採用する環境ならエラーになると思われます。試してないですが,Ubuntu 8.10でもダメでしょう(8.04はOKのはず)。


エラーになる際は,はなぽんさんが書かれている通り次の行をsumversion.cの先頭に挿入して再度makeすればビルドできます。


#include <linux/limits.h>

それにしてもこういうのはライター泣かせですね。締め切り前で(あるいは過ぎて)切羽詰まった環境でどこまでテストすべきなのか……。今回のように自分の環境では何も問題が起きないケースだとこれからも引っかかりそうで,なんとも厳しいですね。

0 件のコメント: