私は共有ライブラリがLinux上でどのように機能するかについては初心者です。 Linuxで、アプリケーションが実行時に同じ共有ライブラリのさまざまなリビジョンをどのように解決するかを理解しようとしています。
私の知る限り、共有ライブラリには3つの「名前」があります。たとえば、
LDCONFIGを介してライブラリをインストールすると、次のシンボリックリンクが作成されます。
ここで、同じライブラリの別のバージョンを次の実名libmy.so.2.0でコンパイルするとします。ガイドラインによるSONAMEはlibmy.so.2.0になります
アプリケーションのリンク時に、「-l」フラグで指定するリンカー名は何ですか。私が読んだガイドライン( http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.htm l)に従って、libmy.soである必要はありません。もしそうなら、objファイルの両方のバージョンはどのように区別されますか?
共有オブジェクトのバージョン管理は次のように機能します。
共有オブジェクトを作成するときは、実際の名前とsoname
の両方を指定します。これらは、共有オブジェクト(オブジェクトとそのオブジェクトへのリンクの両方を作成する)をインストールするために使用されます。
したがって、次のような状況になる可能性があります。
pax> ls -al xyz*
-rw-r--r-- 1 pax paxgroup 12345 Nov 18 2009 xyz.so.1.5
lrwxrwxrwx 1 pax paxgroup 0 Nov 18 2009 xyz.so.1 -> xyz.so.1.5
lrwxrwxrwx 1 pax paxgroup 0 Nov 18 2009 xyz.so -> xyz.so.1
xyz.so.1.5
はxyz.so.1
のSONAME
を所有しています。
リンカがxyz.so
にリンクすると、リンクをxyz.so.1.5
までたどり、xyz.so.1
のSONAME
を使用して実行可能ファイルに格納します。次に、run実行可能ファイルをロードしようとすると、特定のxyz.so.1
(必ずしもバージョン1.5である必要はありません)を指すxyz.so.1.N
をロードしようとします。
したがって、xyz.so.1.6
をインストールしてxyz.so.1
リンクを更新し、代わりにそれを指すようにすると、リンク済みの実行可能ファイルが代わりにそれを使用します。
このマルチレイヤー方式の利点の1つは、互換性のない可能性のある同じ名前のライブラリを複数持つことができることです(xyz.so.1.*
、xyz.so.2.*
)が、各メジャーバージョン内で自由にアップグレードできますそれらは互換性があるはずなので。
新しい実行可能ファイルをリンクする場合:
xyz.so
にリンクしているユーザーは、最新のメジャーバージョンの最新のマイナーバージョンを取得します。xyz.so.1
にリンクしている他のユーザーは、特定のメジャーバージョンの最新のマイナーバージョンを取得します。xyz.so.1.2
にリンクしている他のユーザーは、特定のメジャーバージョンの特定のマイナーバージョンを取得します。コメントを検討するときは、最後の段落を覚えておいてください。
ここで、同じライブラリの別のバージョンを次の実名
libmy.so.2.0
でコンパイルするとします。ガイドラインによるSONAMEはlibmy.so.2.0
になります。
いいえ、私はそうは思いません。 soname
はlibmy.so.2
である可能性が高いため、2.x
ストリームにマイナーな更新を加えて、最新の動作を取得できます。
アプリケーションのリンク時に-lmy
を指定すると、リンカはlibmy.so
という名前のファイルを検索します。このファイルを見つけて、実行可能ファイルにリンクします。このファイルがシンボリックリンクの場合、アプリケーションはシンボリックリンクのターゲットにリンクされます。
アプリケーションのリンク時間はtheアプリケーションで使用するダイナミックライブラリのバージョンを指定する場所です。