ttt

getttyent

(FreeBSD) libmagic.so.1が2つある

2009-08-26 23:59:00 | デジタル・インターネット

とある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のよさではあります。