LPIC-1 - 101試験 - 102:Linuxのインストールとパッケージ管理 - 102.3 共有ライブラリを管理する

Last Update : September 18 2014 21:34:22

     

a. 共有ライブラリ

1.共有ライブラリ

ライブラリ(Library)は、再利用を目的として作成されたコンパイル済みの関数の集合です。汎用性の高い複数のプログラムを、再利用可能な形でひとまとまりにしたものです。一般にライブラリは、それ単体ではプログラムとして動作させることはできないので実行ファイルではありません。ライブラリは他のプログラムに何らかの機能を提供するコードの集まりと言うことができます。
Linux のライブラリには、スタティック・共有・ダイナミックの3種類があります。

  • スタティックライブラリ(静的ライブラリ)
    コンパイル時にコードがプログラムに組込まれます。 モジュールサイズが大きくなりますが、別のマシンにバイナリで配布したときに そのライブラリがなくても動作します。 .a で終わるファイルです。

  • ダイナミックライブラリ(動的ライブラリ)
    プログラムの実行時にロードされるか、その機能が必要になった時点で、呼び出されます。実行時に関数を使って ロードしたり、アンロードしたりできます。 マシンによっては、その共有ライブラリがなかったり、バージョンが違ったりして、動作しないことがあります。 .so と .sa で終わるファイルです。.sa は、古い a.out 形式で使われた共有ライブラリです。 ダイナミックライブラリは、モジュールのロード位置に依存しないコードですので gcc で -fPIC オプションをつけてコンパイルします。


2.スタティックリンクとダイナミックリンク

共有ライブラリを使用するには、コンパイル時にプログラムの中に埋め込まれるか、プログラム起動時に動的にリンクするか、あるいはプログラムの制御によって動的にロードして使用するかのいずれかの方法をとれます。

  • スタティックリンク
    ライブラリはコンパイル済みの別のファイルとして存在しますが、コンパイル時にプログラムの中に埋め込まれます。ライブラリとのリンクはコンパイル時に解決され、ライブラリのコードが丸ごとプログラムに埋め込まれるので、ファイルの配布はコンパイルされたプログラムファイル1つで済みます。

  • ダイナミックリンク(起動時リンク)
    ライブラリは別のファイルとして存在します。ライブラリとのリンクは起動時に解決されます。起動時にライブラリモジュールの中に使用したい関数が存在しない場合はプログラム自体が起動しなくなります。ライブラリモジュールが存在しないことが起動時に瞬時にわかります。

  • ダイナミックリンク(実行時リンク)
    ライブラリは別のファイルとして存在します。起動時にライブラリモジュールの中に使用したい関数が存在しない場合でもプログラムは起動することが出来ます。しかし、該当機能を利用するまでライブラリモジュールが存在しないことがわかりません。


3.必要な共有ライブラリの確認

通常、コマンドなどのプログラムは、メモリ上の共有ライブラリが参照され実行します。 ldd コマンドを実行することで、プログラムやライブラリが参照する共有ライブラリを一覧表示することができます。

# ldd /bin/ls
linux-gate.so.1 => (0xffffe000)
librt.so.1 => /lib/tls/librt.so.1 (0xb7fc8000)
libacl.so.1 => /lib/libacl.so.1 (0xb7fc2000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb7fb0000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7ea7000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7e95000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fec000)
libattr.so.1 => /lib/libattr.so.1 (0xb7e91000)

4.共有ライブラリの利用

プログラムやコマンドの実行時には、ld.soリンカおよびローダーが実行時にリンクする共有ライブラリを検索して必要なライブラリをロードします。そのとき、検索するのが /lib、/usr/libのディレクトリです。これらのディレクトリ以外のライブラリも検索させるには、そのリストを/etc/ld.so.confに記述しておきます。 共有ライブラリをシステムに認識させるために実行するコマンドは、 ldconfig です。
ldconfig は、ライブラリ名とライブラリが格納されているディレクトリ名の対応が記述されている /etc/ld.so.conf を参照し、その対応が記述された共有ライブラリキャッシュファイル /etc/ld.so.cache を作成します。これにより共有ライブラリを使用してプログラムを実行できるようになります。
ld.so.confを更新した時にはldconfigコマンドを用いて ld.so.cache の内容も更新する必要があります。以下のように実行します。

# ldconfig

現在キャッシュに保存されている内容を表示する場合は オプション「-p」をつけて実行します。

# ldconfig -p
755 libs found in cache `/etc/ld.so.cache'
libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
libzvt.so (libc6) => /usr/lib/libzvt.sov libzvt-2.0.so.0 (libc6) => /usr/lib/libzvt-2.0.so.0
libz.so.1 (libc6) => /usr/lib/libz.so.1
libz.so (libc6) => /usr/lib/libz.so

ユーザーごとに共有ライブラリを追加したい場合は環境変数 LD_LIBRARY_PATH を用いることができます。
環境変数 LD_LIBRARY_PATH にライブラリファイルのあるディレクトリパスを指定すると、そのライブラリも検索の対象とすることができます。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sakura/lib

ld.soリンカが共有ライブラリを検索する順序は、環境変数LD_LIBRARY_PATHがまず最初に、次にキャッシュファイルの/etc/ld.so.cacheで、それからデフォルトのライブラリパスの/usr/libと/libになります。


z. 出題範囲概要

●説明 実行可能なプログラムが依存する共有ライブラリを見つけ、必要があればインストールする。
●主要な知識範囲
共有ライブラリを特定する
一般的なシステムライブラリの位置を特定する
共有ライブラリをロードする
●重要なファイル、用語、ユーティリティ
ldd, ldconfig, /etc/ld.so.conf, LD_LIBRARY_PATH


  [ 例題 ] 
  1. 101:102.3 問01  lddコマンド
  2. 101:102.3 問02  lddコマンド
  3. 101:102.3 問03  共有ライブラリを調べる
  4. 101:102.3 問04  共有ライブラリ
  5. 101:102.3 問05  ldconfigコマンド
  6. 101:102.3 問06  ライブラリの置き換え
  7. 101:102.3 問07  共有ライブラリの一覧


     

www.it-shikaku.jp