| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
編集の要約なし
==[[Linux ライブラリ]]==
[[Linux]] |
*以下のサイトから、メモ
<blockquote>特別な例外として、最下層の C ライブラリは「lib」では始まりません</blockquote>
*完全記述の soname は、そのライブラリ自身が含まれるディレクトリをプレフィックスとして含む
*実際のシステムでは、完全記述の soname は、共有ライブラリの「real name」への単なるシンボリックリンクname」への単なるシンボリック[[リンク]]
=====real name=====
*全ての共有ライブラリには「real name」(実際のライブラリコードを含むファイルの名前) がある
*逆に、共有ライブラリを作成するときには、(より詳細なバージョン情報を持つ) 特定のファイル名を持つライブラリのみを作成する
*新しいバージョンのライブラリをインストールするときには、二、三の特別なディレクトリのうちの一つにそれをインストールし、それから ldconfig(8) プログラムを実行
*ldconfig は、既に存在するファイルを調べ、real name へのシンボリックリンクとして へのシンボリック[[リンク]]として soname 群を作成
*同様にして、キャッシュファイル /etc/ld.so.cache も作成。
=====ldconfig は linker name を作成しない=====
*通常、この作成作業はライブラリインストール時におこなう
*単純に、「最新の」soname もしくは最新の real name へのシンボリックリンクとして へのシンボリック[[リンク]]として linker name を作成*ライブラリを更新したら、リンク時にそれを自動的に利用したい場合、soname へのシンボリックリンクとして ライブラリを更新したら、[[リンク]]時にそれを自動的に利用したい場合、soname へのシンボリック[[リンク]]として linker name を作っておく
*なぜ ldconfig が自動的に linker name を作成しないのか
**基本的には、「最新バージョンを使ってコードを実行したいと思われるかも知れないが、そうではなく古いライブラリをリンクしながらの開発作業を希望されることもあるだろう」基本的には、「最新バージョンを使ってコードを実行したいと思われるかも知れないが、そうではなく古いライブラリを[[リンク]]しながらの開発作業を希望されることもあるだろう」**そのため、ldconfig は、プログラムをどのライブラリにリンクさせたいのかということについては、何の仮定もおこなわないは、プログラムをどのライブラリに[[リンク]]させたいのかということについては、何の仮定もおこなわない**ライブラリとしてリンカに使わせるものを実際に更新するためには、インストーラがシンボリックリンクを個別に変更しなければならないライブラリとしてリンカに使わせるものを実際に更新するためには、インストーラがシンボリック[[リンク]]を個別に変更しなければならない
=====例=====
*完全記述の soname
*ldconfig が /usr/lib/libreadline.so.3.0 というような何らかの real name に対するシンボリックリンクとして作成に対するシンボリック[[リンク]]として作成
/usr/lib/libreadline.so.3
*linker nameも作成するべき
*/usr/lib/libreadline.so.3 を参照するシンボリックリンクとなるでしょうを参照するシンボリック[[リンク]]となるでしょう
/usr/lib/libreadline.so
===ライブラリはどのように使われるか===
====プログラムローダ====
*GNU glibc ベースのシステム(全ての [[Linux]])では、ELF バイナリ実行ファイルを起動すると、自動的にプログラムローダがロードされ実行される
*ローダは /lib/ld-linux.so.X (X にはバージョン番号) という名前
*ローダは、プログラムによって使用されるその他の全ての共有ライブラリを順次探し出し、ロードローダは、プログラムによって使用される[[その他]]の全ての共有ライブラリを順次探し出し、ロード
====検索対象となるディレクトリのリスト====
*/etc/ld.so.conf ファイル内に記述
=====Red [[R]]ed Hat から派生しているディストリビューション=====
*多くは、通常 /etc/ld.so.conf ファイル内に /usr/local/lib を含めていない。
<blockquote>/usr/local/lib を /etc/ld.so.conf に追加することは、システム上で多くのプログラムを走らせるのに必要な、共通の「修正」</blockquote>
====キャッシュ処理====
*プログラム起動時にこれら全てのディレクトリを検索するのは、とても非効率的なので、実際にはキャッシュ処理がおこなわれます。
*ldconfig(8) プログラムはデフォルトで /etc/ld.so.conf ファイルを読み込み、適切なシンボリックリンクを動的リンクディレクトリ内に作成ファイルを読み込み、適切なシンボリック[[リンク]]を動的[[リンク]]ディレクトリ内に作成
*キャッシュを /etc/ld.so.cache に書き込み
<blockquote>DLL を追加したとき、または、DLL を削除したり、DLL ディレクトリのセットを変更したりしたときには必ず、ldconfig を実行しなければならない</blockquote>
===環境変数===
====LD_LIBRARY_PATHLD_LIB[[R]]A[[R]]Y_PATH====
*特定のプログラムを実行する際、一時的に別のライブラリを代替的に使用することができる。
*標準的なディレクトリ群に先立ってライブラリ検索対象とすべきディレクトリ群を、コロンで区切って並べる
*新しいライブラリをデバッグするときや、特殊な目的のために非標準的なライブラリを使用するときなどに便利
*http://www.visi[[vi]]si.com/~barr/ldpath.html
<blockquote>開発やテストには便利ですが、一般ユーザに日常的に使用させようとして、インストール処理で変更すべきではない</blockquote>
==動的ライブラリ (dynamically loaded library)==
*プログラムの起動時以外のときにロードされるライブラリ
*動的ライブラリは、プラグインやモジュールを実装するときに特に便利動的ライブラリは、[[プラグイン]]やモジュールを実装するときに特に便利
*標準的なオブジェクトファイルや共有ライブラリとしてビルドされてい
*主な違いは、動的ライブラリは、プログラムのリンク時や起動時に自動的にはロードされない、という点主な違いは、動的ライブラリは、プログラムの[[リンク]]時や起動時に自動的にはロードされない、という点
*そのかわりに、ライブラリをオープンし、シンボルを検索し、エラーを処理し、ライブラリを閉じる、という API が存在
*この API を使用するためには、C プログラマはヘッダファイル <dlfcn.h> をインクルードする必要がある

案内メニュー