ぱそくま ろご
Linux > パッケージ管理 > 共有ライブラリとは?

共有ライブラリとは?

共有ライブラリとは?

Linuxでよく言われている共有ライブラリとは、

  • 動的にリンクしているライブラリ。
  • 一度に色々なプログラムから呼ぶことが可能(排他的ではない)。

な、ライブラリの事です。共有ライブラリの拡張子は「.so」です。 なお、動的リンクや静的リンクに関しては次章をご覧ください。

静的リンクと動的リンク

テキストエディタや表計算ソフト、ペイントソフトなどには、必ず「ファイルを開く」や「ファイルを保存する」機能を持っています。 このような機能は多くのアプリケーションで必要なので開発者はそれを実装しないといけません。ただし、各ソフトの開発者が別々に開発したのでは効率がよくないし、画面の統一感もありません。よって、この機能のみを提供するようなプログラムを別に作成しておけば、どのアプリケーションでもそれを利用すれば開発する手間が省けます。 そのようなプログラムをライブラリといいます。 なお、アプリケーションがライブラリを使うためには、ライブラリをアプリケーションに「リンク」する必要があります。 このリンク方法には静的リンクと動的リンクがあり、実行ファイルを作成する際にリンク方法が異なります。

  • 静的リンク:ライブラリ自体を組み込んで実行ファイルを作成(コンパイル)する方法。
  • 動的リンク:ライブラリを直接埋め込まず、「ライブラリを呼び出しますよ」とリンク情報のみを埋め込む方法。

静的リンクは直接プログラムに埋め込むので、ライブラリ分、プログラムサイズが大きくなります。 また、ライブラリに不具合があった場合、修正版のライブラリを再度埋め込み、コンパイルする必要があります。 動的リンクはライブラリを埋め込まないのでサイズも小さく、ライブラリの修正に影響されません。 ただし、システム障害が起きて、動的リンクライブラリが使用できなくなった場合、まったく動かなくなります。



共有ライブラリを使えるようにする - ldconfig

プログラムが共有ライブラリを使うにはld-linux.so*(ld-linux-x86-64.so*,ld.so)が必要となります。 ld-linux.soは共有ライブラリを環境変数「LD_LIBRARY_PATH」や/etc/ld.so.cacheファイルを元に共有ライブラリを探し、プロセスにリンクさせます。 よって、事前に/etc/ld.so.cacheファイルが必要になります。 (もちろん、新しい共有ライブラリを追加したら、ld.so.cacheファイルを再作成する必要があります。) このファイルを作るのがldconfigコマンドです。 なお、ldcounfigには以下の設定ファイルがあります。

ldconfigの設定ファイル
ファイル 概要
/etc/ld.so.conf 基本となる設定ファイルです。共有ライブラリをおいてあるディレクトリのリストを記述します。
/etc/ld.so.conf.d/* 最近(?)の設定ファイルには、外部の設定ファイルを読み込む設定ができるものが多くなっていいます。(httpd/conf.d/など) ldconfigの場合、このディレクトリがデフォルトの外部設定ファイル置き場となります。

なお、現在のキャッシュの内容は「p」オプションを使うと確認することができます。

共有ライブラリのキャッシュの表示

[paso ~]ldconfig -p
476 ライブラリがキャッシュ `/etc/ld.so.cache で見つかりました
        libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
        libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4
        libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
        libxcb.so.1 (libc6,x86-64) => /usr/lib64/libxcb.so.1
        libxcb-xvmc.so.0 (libc6,x86-64) => /usr/lib64/libxcb-xvmc.so.0
.
.
.

共有ライブラリを調べる - ldd

プログラムが使っている共有ライブラリを調べるにはlddコマンドを使います。

lsが使っている共有ライブラリを調べる

[paso ~]ldd /bin/ls
        linux-vdso.so.1 =>  (0x00007fffc50f3000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f72c7194000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f72c6f8c000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007f72c6d87000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007f72c6b7f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f72c67ec000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f72c65e7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f72c73be000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f72c63ca000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007f72c61c5000)