Linux の共有ライブラリを理解する
プログラミングにおけるライブラリとは、プログラム内で再利用できる、コンパイル済みのコードの集まりです。ライブラリは、自分のプログラムで使用できる再利用可能な関数、ルーチン、クラス、データ構造など (別のプログラマによって作成された) を提供するため、プログラマの作業を簡素化します。
たとえば、数学演算を実行する必要があるアプリケーションを構築している場合、そのための新しい数学関数を作成する必要はなく、そのプログラミング言語のライブラリにある既存の関数を使用するだけで済みます。
Linux のライブラリの例には、libc (標準 C ライブラリ) または Glibc (標準 C ライブラリの GNU バージョン)、libcurl (マルチプロトコル ファイル) が含まれます。転送ライブラリ)、libcrypt (C での暗号化、ハッシュ、エンコードに使用されるライブラリ) など。
Linux は、次の 2 つのクラスのライブラリをサポートしています。
- 静的ライブラリ – コンパイル時にプログラムに静的にバインドされます。
- 動的ライブラリまたは共有ライブラリ – プログラムの起動時にロードされてメモリにロードされ、実行時にバインドが行われます。
動的ライブラリまたは共有ライブラリはさらに次のように分類できます。
- 動的にリンクされたライブラリ – ここでは、プログラムが共有ライブラリにリンクされ、カーネルは実行時にライブラリを読み込みます(メモリにない場合)。
- 動的に読み込まれるライブラリ – ライブラリを使用して関数を呼び出すことにより、プログラムが完全な制御を取得します。
共有ライブラリの命名規則
共有ライブラリには、ライブラリ名 (soname とも呼ばれます) と「ファイル名」 (ライブラリ コードを保存するファイルへの絶対パス) という 2 つの方法で名前が付けられます。
たとえば、libc の soname は libc.so.6 です。lib はプレフィックス、 >c はわかりやすい名前であり、共有オブジェクトを意味し、6 はバージョンを表します。ファイル名は /lib64/libc.so.6 です。 soname は実際にはファイル名へのシンボリック リンクであることに注意してください。
Linux での共有ライブラリの検索
共有ライブラリは、ld.so (または ld.so.x) および ld-linux.so (または ld- linux.so.x) プログラム。x はバージョンです。 Linux では、/lib/ld-linux.so.x はプログラムで使用されるすべての共有ライブラリを検索してロードします。
プログラムは、ライブラリ名またはファイル名を使用してライブラリを呼び出すことができ、ライブラリ パスには、ファイル システム内でライブラリを見つけることができるディレクトリが保存されます。デフォルトでは、ライブラリは /usr/local/lib、/usr/local/lib64、/usr/lib、 にあります。 /usr/lib64;システム起動ライブラリは /lib と /lib64 にあります。ただし、プログラマはライブラリをカスタムの場所にインストールできます。
ライブラリ パスは、コマンドライン エディタで編集できる /etc/ld.so.conf ファイルで定義できます。
vi /etc/ld.so.conf
このファイル内の行は、/etc/ld.so.conf.d にファイルをロードするようにカーネルに指示します。このようにして、パッケージ管理者またはプログラマは、カスタム ライブラリ ディレクトリを検索リストに追加できます。
/etc/ld.so.conf.d ディレクトリを調べると、いくつかの一般的なパッケージ (kernel、mysql、postgresql) の .conf ファイルが表示されます。この場合):
ls /etc/ld.so.conf.d
kernel-2.6.32-358.18.1.el6.x86_64.conf kernel-2.6.32-696.1.1.el6.x86_64.conf mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf kernel-2.6.32-696.6.3.el6.x86_64.conf postgresql-pgdg-libs.conf
mariadb-x86_64.conf を見ると、パッケージ ライブラリへの絶対パスが表示されます。
cat mariadb-x86_64.conf
/usr/lib64/mysql
上記のメソッドは、ライブラリ パスを永続的に設定します。一時的に設定するには、コマンド ラインで LD_LIBRARY_PATH 環境変数を使用します。変更を永続的に保持したい場合は、シェル初期化ファイル /etc/profile (グローバル) または ~/.profile (ユーザー固有) にこの行を追加します。
export LD_LIBRARY_PATH=/path/to/library/file
Linux での共有ライブラリの管理
次に、共有ライブラリを扱う方法を見てみましょう。バイナリ ファイルのすべての共有ライブラリ依存関係のリストを取得するには、ldd ユーティリティを使用できます。 ldd の出力は次の形式になります。
library name => filename (some hexadecimal value)
OR
filename (some hexadecimal value) #this is shown when library name can’t be read
このコマンドは、ls コマンドのすべての共有ライブラリの依存関係を表示します。
ldd /usr/bin/ls
OR
ldd /bin/ls
サンプル出力
linux-vdso.so.1 => (0x00007ffebf9c2000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)
共有ライブラリはさまざまなディレクトリに存在する可能性があるため、プログラムの起動時にこれらすべてのディレクトリを検索するのは非常に非効率になります。これは、動的ライブラリの欠点の 1 つと考えられます。したがって、プログラムldconfigによって実行されるキャッシュのメカニズムが採用されています。
デフォルトでは、ldconfig は /etc/ld.so.conf の内容を読み取り、ダイナミック リンク ディレクトリに適切なシンボリック リンクを作成し、 にキャッシュを書き込みます。 >/etc/ld.so.cache これは、他のプログラムによって簡単に使用されます。
これは、新しい共有ライブラリをインストールしたばかりの場合、独自のライブラリを作成したばかりの場合、または新しいライブラリ ディレクトリを作成した場合に特に非常に重要です。変更を有効にするには、ldconfig コマンドを実行する必要があります。
ldconfig
OR
ldconfig -v #shows files and directories it works with
共有ライブラリを作成したら、それをインストールする必要があります。これを上記の標準ディレクトリのいずれかに移動し、ldconfig コマンドを実行します。
あるいは、次のコマンドを実行して、soname からファイル名へのシンボリック リンクを作成します。
ldconfig -n /path/to/your/shared/libraries
独自のライブラリの作成を開始するには、The Linux Documentation Project (TLDP) のこのガイドを参照してください。
それは今のところすべてです!この記事では、ライブラリの概要と共有ライブラリ、および Linux での共有ライブラリの管理方法について説明しました。ご質問や共有したい追加のアイデアがある場合は、以下のコメント フォームをご利用ください。