FreeBSD QandA 37
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 まで
お知らせください。