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


230

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

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

また、ライブラリ(両方の種類)をロードするための基本的なメカニズムと、ライブラリのコードがどこかで使用されたときにどのように呼び出されるかについても知りたいです。カーネルのどの部分を調べればよいですか?そして、プロセスがどのように実行されているかを知るために、関連するどの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

回答:


306

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

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

.laファイルは、対応するライブラリを構成するファイルを記述するためにGNU "libtools"パッケージで使用されるテキストファイルです。これらの詳細については、この質問をご覧ください。libtoolの.laファイルは何のためのものですか?

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

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

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

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

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

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

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


1
@Barmar、それであなたは静的ライブラリの利点が動的ライブラリの利点を上回ると言っていますか?
パチェリエ2015年

4
@Pacerierどこから来たのかわかりません。
Barmar

13
それは無意味な質問です。賛否両論の重みは状況に依存し、普遍的な答えはありません。あなたは議題を持っているようで、私を餌にしようとしているようです。
Barmar

3
@Barmar、いや、私は無実だ。好奇心旺盛な人。
Pacerier、2015

11
もう1つの要因はライセンスです。LGPLは商用の状況、つまりソースを配布したくない場合に動的リンクを必要とします。
Sam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.