とあるFreeBSDマシン(1)で、偶然気がついたんですが
% ldd /usr/local/lib/php/20060613/http.so
/usr/local/lib/php/20060613/http.so:
libmagic.so.1 => /usr/local/lib/compat/libmagic.so.1 (0x281d9000)
libevent-1.4.so.3 => /usr/local/lib/libevent-1.4.so.3 (0x281e6000)
libcurl.so.5 => /usr/local/lib/libcurl.so.5 (0x28300000)
libssl.so.5 => /usr/local/lib/libssl.so.5 (0x28341000)
libcrypto.so.5 => /usr/local/lib/libcrypto.so.5 (0x28385000)
libz.so.4 => /lib/libz.so.4 (0x284cc000)
libc.so.7 => /lib/libc.so.7 (0x28089000)
librt.so.1 => /usr/lib/librt.so.1 (0x284de000)
libthr.so.3 => /lib/libthr.so.3 (0x284e3000)
というように、/usr/local/lib/compat/以下の共有ライブラリが参照されていました。
別のFreeBSDマシン(2)で調べてみると
% ldd /usr/local/lib/php/20060613/http.so
/usr/local/lib/php/20060613/http.so:
libmagic.so.1 => /usr/local/lib/libmagic.so.1 (0x481d9000)
libevent-1.4.so.3 => /usr/local/lib/libevent-1.4.so.3 (0x48300000)
libcurl.so.5 => /usr/local/lib/libcurl.so.5 (0x48316000)
libssl.so.5 => /usr/local/lib/libssl.so.5 (0x48357000)
libcrypto.so.5 => /usr/local/lib/libcrypto.so.5 (0x4839b000)
libz.so.4 => /lib/libz.so.4 (0x481ed000)
libc.so.7 => /lib/libc.so.7 (0x48089000)
librt.so.1 => /usr/lib/librt.so.1 (0x484e2000)
libthr.so.3 => /lib/libthr.so.3 (0x484e7000)
という感じで、compatではない、/usr/local/lib/の共有ライブラリが参照されていました。
どちらも、FreeBSD 7.2なマシンなんですが、同じlibmagic.so.1を見ているけど、場所が異なるって、どういうこと?
FreeBSDマシン(1)で調べてみると、libmagic.soなファイルは
% locate libmagic.so.
/usr/lib/libmagic.so.3
/usr/local/lib/compat/libmagic.so.1
/usr/local/lib/compat/libmagic.so.2
1、2、3と、3種類もある。
FreeBSDマシン(2)でも同様に調べてみると、libmagic.soなファイルは
% locate libmagic.so.
/usr/lib/libmagic.so.3
/usr/local/lib/compat/libmagic.so.2
/usr/local/lib/libmagic.so.1
やっぱり1、2、3と、3種類もあるんですが、ディレクトリが異なります。
FreeBSDマシン(1)でのlibmagic.so.1は何者ぞ?
% pkg_which /usr/local/lib/compat/libmagic.so.1
compat5x-i386-5.4.0.8_9
FreeBSDマシン(2)でのlibmagic.so.1は何者ぞ?
% pkg_which /usr/local/lib/libmagic.so.1
file-4.26
おぉ?! なんだそりゃ。
同じ名前で、由来の異なる共有ライブラリがあるじゃないですか。
トラブルのタネになりそうで、気持ち悪いです。
ついでにいえば、file-4.26は、ports/sysutils/fileでインストールしたものですが、/usr/bin/fileと、/usr/local/bin/fileの、2つのfileコマンドが存在することになってしまうんですよね。それも、トラブルのタネになりそうです。
そういえば、昔、/usr/bin/lprと/usr/local/bin/lprの2つの、同名だけど微妙に別機能のコマンドがあって、混乱したことがあったっけ。
なぜFreeBSDマシン(2)では、portsのfileがインストールされてたかというと、
% pkg_info -R file-4.26
Information for file-4.26:
Required by:
amavisd-milter-1.4.0
amavisd-new-2.6.4_1,1
ふーん・・・
実は、FreeBSDマシン(2)でバイナリパッケージを作っておいて、そのあとFreeBSDマシン(1)でバイナリパッケージを使って、インストール/アップデートをしています。
ただ、FreeBSDマシン(1)には、amavisd-*をインストールしていませんでした。たまたまインストールしてあったcompat5x-i386-5.4.0.8_9には、同名のlibmagic.so.1があったので、偶然にもライブラリのシンボルは解決できてしまっていた、というわけでした。気持ち悪いなぁ。
☆
/usr/local/lib/php/20060613/http.so は、ports/www/pecl-pecl_httpでインストールされたファイルだったと思いますが、これ、どうせなら/usr/lib/libmagic.so.3をリンクしてくれればいいのに、と思いました。
似たようなところで、ports/sysutils/pecl-fileinfo の場合、
% ldd /usr/local/lib/php/20060613/fileinfo.so
/usr/local/lib/php/20060613/fileinfo.so:
libmagic.so.3 => /usr/lib/libmagic.so.3 (0x2818f000)
libc.so.7 => /lib/libc.so.7 (0x28089000)
libz.so.4 => /lib/libz.so.4 (0x281a1000)
と、/usr/lib/libmagic.so.3なんですよね。
☆
/usr/local/lib/compat/以下のライブラリが参照されることに気がついたのは、最近、ports/devel/libltdl22へアップデートしたので、再ビルドしまくっていたときのことでした。
% ldd /usr/local/lib/php/20060613/mcrypt.so
/usr/local/lib/php/20060613/mcrypt.so:
libmcrypt.so.8 => /usr/local/lib/libmcrypt.so.8 (0x28194000)
libltdl.so.4 => /usr/local/lib/compat/pkg/libltdl.so.4 (0x281c5000)
libc.so.7 => /lib/libc.so.7 (0x28089000)
という感じで、古いライブラリをリンクしたままのものが、いくつか見つかりました。portsのバージョン番号(末尾につく、_1とか_2の部分)が更新されないので、こうなってしまうんですが、仕方ないので、portupgrade -fで、強制的に再ビルドしまくりました。
ついでに見つかったのが、gnutlsで、これも古いほうをリンクしたままのがいくつかありました。
% ldd /usr/local/libexec/clock-applet|grep compat
libgnutls.so.26 => /usr/local/lib/compat/pkg/libgnutls.so.26 (0x292db000)
portsは、ソフトのバージョンアップにすばやく対応できるすぐれものですが、なかなかすぐには完璧に対応しきれないところもありますね。
もっとも、わかっていれば、自分でなんとかなってしまう、ってのもportsのよさではあります。