FreeBSD QandA 37

FreeBSD QandA

Q. packages のように、バイナリ形式で公開されているコマンドを実行しようと
   したら、
     ld.so failed: Can't find shared library "lib*.so.x.y"
   とか、
     /usr/libexec/ld-elf.so.1: Shared object "lib*.so.x" not found
   と言われて動きません。

A. 違うバージョンの FreeBSD 用に作られた、ダイナミックリンクされたバイナリ
   を実行しようとした場合に表示されるエラーメッセージです。1番目のエラーは 
   a.out(5) 形式、2番目のエラーは elf(5) 形式のバイナリを実行しようとした
   場合です。

   対策方法はもちろん FreeBSD のバージョンに合ったものをインストール仕直す
   のが一番良いのですが、なんらかの事情で OS より古いバイナリを実行したい
   場合は、FreeBSD の配布ファイルから compat{1x,20,21,22,3x,4x} など、互換
   ライブラリを導入すれば解決できます。どの互換ライブラリをインストールす
   れば良いか分からなければ、配布メディアが /cdrom/ にあるとして、

     # fgrep libc.so.3 /cdrom/compat*/*.mtree

   とします。ここでは例として libc.so.3 を探すとしますが、このコマンドの
   実行結果次のように表示されます。

     /cdrom/compat22/compat22.mtree:     libc.so.3.1     size=427501 \
     /cdrom/compat3x/compat3x.mtree:     libc.so.3       size=521297 \

   これで、compat3x が必要なことが分かりましたから、次のコマンドでシステム
   へ追加インストールします。

     # cd /cdrom/compat3x
     # sh install.sh

   そのほか目安として、新しい shared library の方が大きい数字を用いていま
   す。また、packages の依存関係を無視して強制的に pkg_add(1) したときにも
   同様のことが起り得ます。

   一方、OS より新しいバイナリである場合には、そのバイナリを使用しないのが
   賢明です。自分が使っている FreeBSD 用のバイナリを入手するか、ports を使
   うなどして自分でコンパイルし直しましょう。
    「shared library だけ新しい物を持って来る」
    「今 持っている shared library を copy して番号だけをごまかす」
   など無理なことをするのは、コマンドの誤動作を引き起こし、非常に危険です
   から絶対にやめましょう。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。