web-dev-qa-db-ja.com

アプリケーションは、実行時に異なるバージョンの共有ライブラリにどのように解決されますか?

私は共有ライブラリがLinux上でどのように機能するかについては初心者です。 Linuxで、アプリケーションが実行時に同じ共有ライブラリのさまざまなリビジョンをどのように解決するかを理解しようとしています。

私の知る限り、共有ライブラリには3つの「名前」があります。たとえば、

  1. libmy.so.1.2(実名、つまり実際のobjファイル)
  2. libmy.so.1(SONAME、実際のobjファイルに埋め込まれています)
  3. libmy.so(リンカー名、リンク時にリンカーに提供され、実行可能ファイルに埋め込まれます)

LDCONFIGを介してライブラリをインストールすると、次のシンボリックリンクが作成されます。

  • (2)=>(1)
  • (3)=>(2)

ここで、同じライブラリの別のバージョンを次の実名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ファイルの両方のバージョンはどのように区別されますか?

36
nisah

共有オブジェクトのバージョン管理は次のように機能します。

共有オブジェクトを作成するときは、実際の名前と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.5xyz.so.1SONAMEを所有しています。

リンカがxyz.soにリンクすると、リンクをxyz.so.1.5までたどり、xyz.so.1SONAMEを使用して実行可能ファイルに格納します。次に、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になります。

いいえ、私はそうは思いません。 sonamelibmy.so.2である可能性が高いため、2.xストリームにマイナーな更新を加えて、最新の動作を取得できます。

42
paxdiablo

アプリケーションのリンク時に-lmyを指定すると、リンカはlibmy.soという名前のファイルを検索します。このファイルを見つけて、実行可能ファイルにリンクします。このファイルがシンボリックリンクの場合、アプリケーションはシンボリックリンクのターゲットにリンクされます。

アプリケーションのリンク時間はtheアプリケーションで使用するダイナミックライブラリのバージョンを指定する場所です。

2
Didier Trosset
  1. Libの名前にはさまざまなバージョンがあります。
  2. 「lib」という名前のパッケージにはlibのみがあり、名前には異なるバージョンがあります。
  3. 別のライブラリを定義しない限り、システムは最新のライブラリでのみコンパイルされます。
  4. アプリケーションは、必要なライブラリのみを使用します。 ldd、readelfを確認してください。
  5. アプリにはリンク.soおよび.pcファイルが含まれています。rpmシステムで何を確認してください。 https://fedoraproject.org/wiki/Packaging:Guidelines?rd=Packaging#Devel_Packages
0
guest