• HTML
  • CSS
  • Linux
  • Perl
  • Windows
  • Hardware
  • OpenSUSE
  • Slackware
  • MySQL
  • Vim
  • JavaScript
  • Network
  • Security
  • Debian
  • PHP
  • MovableType
  • Postfix
  • Lenovo X200S
  • Dovecot
  • BIND
  • Samba
  • Apache
  • MacBook Air
  • SSH
  • Raspberry Pi
  • [Linux] 共有ライブラリ(lib*.so.*)の管理

    共有ライブラリは、プログラムの実行時に動的に読み込まれます。今日のLinux上のプログラムは、ほとんどが共有ライブラリを使用するようビルドされています。

    ライブラリを静的にリンクしないことにより、次のようなメリットが得られます。

    複数のプログラムで同じライブラリをリンクする必要がないので、各々のプログラムのサイズが小さくなる。
    ライブラリを修正した場合、修正された共有ライブラリのみを差し替えるのみでよい。静的にリンクされている場合は関係するプログラムをすべてビルドし直さなければならない。

    ldd - 依存する共有ライブラリを表示
    指定したプログラムが依存する共有ライブラリを表示します。”=>”の左側が必要な共有ライブラリ、右側がその共有ライブラリが実在するパスです。

    $ ldd /usr/sbin/postfix
    linux-gate.so.1 => (0xb7fad000)
    libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb7f7f000)
    libdb-4.2.so => /usr/lib/libdb-4.2.so (0xb7eaa000)
    libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7e93000)
    libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7e80000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d4c000)
    /lib/ld-linux.so.2 (0xb7fae000)

    依存する共有ライブラリが存在しない、もしくは見つからない場合は”=>”の右側には “not found”と表示されます。

    libpcre.so.3 => not found

    ld-linux.so.2 - ダイナミックリンカ
    共有ライブラリの読み込みは、ダイナミックリンカld-linux.so.2が行います。

    /etc/ld.so.cache - 共有ライブラリ検索のためのキャッシュファイル
    /etc/ld.so.cacheは、ダイナミックリンカld-linux.so.2が共有ライブラリのファイルシステム上での位置を特定するためのファイルです。したがって、ld.so.cacheに登録されていない共有ライブラリはld-linux.so.2は見つけることができません。

    ld.so.cacheはバイナリファイルですので、catなどで表示することはできません。内容を確認するには、ldconfigコマンドを-p付きで実行します。

    $ /sbin/ldconfig -p | head
    296 libs found in cache `/etc/ld.so.cache'
    libzzipwrap-0.so.12 (libc6) => /usr/lib/libzzipwrap-0.so.12
    libzzip-0.so.12 (libc6) => /usr/lib/libzzip-0.so.12
    libz.so.1 (libc6) => /usr/lib/libz.so.1
    libz.so (libc6) => /usr/lib/libz.so
    libxml2.so.2 (libc6) => /usr/lib/libxml2.so.2
    libwrap.so.0 (libc6) => /lib/libwrap.so.0
    libuuid.so.1 (libc6) => /lib/libuuid.so.1
    libutil.so.1 (libc6, hwcap: 0x8008000000008000, OS ABI: Linux 2.6.0) => /lib/tls/i686/cmov/libutil.so.1
    libutil.so.1 (libc6, hwcap: 0x8000000000000000, OS ABI: Linux 2.6.0) => /lib/tls/libutil.so.1

    キャッシュの再構築
    前述の通りキャッシュファイル/etc/ld.so.cacheはダイナミックリンカld-linux.so.2が共有ライブラリをファイルシステム上から探し出すのに利用されます。したがって、新たに共有ライブラリを追加してもキャッシュが更新されなければダイナミックリンカは共有ライブラリの存在を知ることができません。

    キャッシュの再構築はldconfigで行います。デフォルトでは、/lib、/usr/lib、および/etc/ld.so.confに記述されたディレクトリを検索してキャッシュを更新します。

    # /sbin/ldconfig

    それ以外のディレクトリにおかれた共有ライブラリをキャッシュに追加するためには、/etc/ld.so.confの末尾にそのディレクトリのパス名を追加します。

    なお、/etc/ld.so.confを変更せずに /sbin/ldconfig /usr/local/foo/lib などと実行すると、そのときはキャッシュに/usr/local/foo/lib以下の共有ライブラリが追加されますが、次回/sbin/ldconfigで再構築すると/usr/local/foo/lib以下の共有ライブラリはキャッシュから消えてしまいます。これは、デフォルトのディレクトリおよび /etc/ld.so.conf に記述されたディレクトリのみがキャッシュ再構築時の検索対象となってしまうためです。

    Linuxサーバー管理に関する書籍