web-dev-qa-db-ja.com

/lib/libc.so.6が見つからないのはなぜですか?

find | grep libc.so.6

/lib/i386-linux-gnu/libc.so.6にあることが明らかになりましたが、私が実行していたスクリプトは、/libの直下にあることを期待していたので、少なくともシンボリックリンクがないのはなぜですか?

そこにシンボリックリンクを置くと、何かを壊す危険がありますか?

20
Erik B

libc.soは、Ubuntu 11.04での multiarch 作業の一部として移動されました。シンボリックリンクが存在できない理由は、multiarchの目的がlibci386AMD64バージョンの両方を同時にインストールできるようにすることであるため、 64ビットシステムで32ビットバイナリをより簡単に実行でき、その逆も同様です(および他の同様の状況)。 libc6パッケージに新しい場所へのシンボリックリンクが含まれている場合、異なるアーキテクチャのそのパッケージのバージョンは両方とも同時にインストールできません(どのバージョンのシンボリックリンクがdpkgを選択しますか?) 、演習のポイント全体を打ち負かす。

libc.soへのパスをハードコードするものはすべて、Ubuntu 11.04以降で正常に動作するように更新する必要があります。話しているスクリプトがUbuntuの一部である場合は、バグを報告してmultiarchタグを追加してください。

22
Colin Watson

動的ライブラリはカーネルによってロードされ、パスはプログラムにハードコーディングされていません。プログラムには、「libc.so.6が必要です」とだけ書かれています。システムは、デフォルトで/etc/ld.so.confおよび/usr/libを含む、/libで定義されているライブラリパスを検索します。このファイルには、/etc/ld.so.conf.dに追加の構成ファイルが含まれています。

64ビットシステムでは、libc.so.6でパスが定義されているため、/lib/x86_64-linux-gnu/libc.so.6/etc/ld.so.conf.d/x86_64-linux-gnu.confを見つけることができます。

# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

プログラムによってロードされたライブラリを調べるには、ldd /bin/bashのようにlddを使用します。

    linux-vdso.so.1 =>  (0x00007ffff1dff000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00007f9d8b3b8000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d8b1b4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d8ae1f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d8b61c000)

シンボリックリンクを配置しても何も壊れません。

検索されるディレクトリのリストを取得するには、次を実行します。

ldconfig -v -N | grep '^/'

-vは、ファイルとディレクトリのリストを表示します。-Nは、キャッシュ(/etc/ld.so.cache)の再作成を防ぎます。

10
Lekensteyn

次のように、libc.so.6ファイルにシンボリックリンクを追加するだけです。

Sudo ln -s /lib/i386-linux-gnu/libc.so.6 /lib/libc.so.6

同じことは、まだシステム上にある他の欠落ファイルにも当てはまります。私の場合、Matlabがファイルを欠落していましたが、問題はなくなりました。

5
Robert Hughes