web-dev-qa-db-ja.com

.so、.la、および.aライブラリファイルの違いは何ですか?

.soファイルは一種の動的ライブラリです(スレッドの多くはそのようなライブラリを共有できるため、メモリに複数のコピーを保持する必要はありません)。しかし、.a.laの違いは何ですか?これらはすべて静的ライブラリですか?

動的ライブラリに静的ライブラリよりも大きな利点がある場合、なぜ静的ライブラリがまだたくさんあるのですか?

また、ライブラリ(両方の種類)をロードするための基礎となるメカニズムと、どこかで使用されたときにlib内のコードがどのように呼び出されるかを知りたいです。カーネルのどの部分を調査すればよいですか?また、プロセスがどのように実行されているかを知るために、関連するLinuxコマンド/ユーティリティを知っておく必要がありますか? (今のところldコマンドしか知らない)

.soまたは.aにコードをビルドするのはいつですか?どっちがいいですか?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so
201
hugemeow

.soファイルは動的ライブラリです。サフィックスは「共有オブジェクト」を表します。これは、ライブラリにリンクされているすべてのアプリケーションが、結果の実行可能ファイルにコピーを作成するのではなく、同じファイルを使用するためです。

.aファイルは静的ライブラリです。接尾辞は「アーカイブ」を表します。これは、元の.oオブジェクトファイルの実際の単なるアーカイブ(arコマンドで作成され、現在ライブラリを作成するために使用されているtarの前身)です。

.laファイルはGNU "libtools"パッケージで使用されるテキストファイルで、対応するライブラリを構成するファイルを記述します。この質問でそれらについての詳細を見つけることができます: libtoolの.laファイルは何のためですか?

静的および動的ライブラリにはそれぞれ長所と短所があります。

静的プロ:ユーザーは常に、アプリケーションでテストしたライブラリのバージョンを使用するため、互換性に関する驚くべき問題は発生しません。

Static con:ライブラリで問題が修正された場合、それを利用するにはアプリケーションを再配布する必要があります。ただし、ユーザーが自分で更新する可能性が高いライブラリでない限り、とにかくこれを行う必要があります。

Dynamic pro:ライブラリに使用されるメモリはライブラリを使用するすべてのプロセスで償却されるため、プロセスのメモリフットプリントは小さくなります。

Dynamic pro:実行時にライブラリをオンデマンドでロードできます。これはプラグインに適しているため、ソフトウェアをコンパイルおよびインストールするときに使用するプラグインを選択する必要はありません。新しいプラグインはその場で追加できます。

動的な欠点:ライブラリは、誰かがアプリケーションをインストールしようとしているシステムに存在しないか、アプリケーションと互換性のないバージョンを持っている可能性があります。これを軽減するには、アプリケーションパッケージにライブラリのコピーを含める必要があり、必要に応じてインストールできます。これは多くの場合、必要な依存関係をダウンロードしてインストールできるパッケージマネージャーによって緩和されます。

ダイナミックライブラリは、libcなどのシステムライブラリに特に役立ちます。多くの場合、これらのライブラリには、カーネルインターフェイスが変更されたため、特定のOSおよびバージョンに依存するコードを含める必要があります。プログラムを静的システムライブラリにリンクする場合、このライブラリバージョンが作成されたOSのバージョンでのみ実行されます。ただし、動的ライブラリを使用する場合、実行するシステムにインストールされているライブラリが自動的に選択されます。

268
Barmar