3

RedHatLinux用のネームサービススイッチモジュールを作成しました。

.so.2 straceを使用して、OSがさまざまなディレクトリでライブラリを検索することを決定しましたが、拡張子が(たとえば、サービス名はlibnss_xxx.so.2どこですか)のファイルのみを検索します。xxx

なぜそれは.soまたは.so.1ライブラリを探しないのですか?.so.2将来、図書館を探すのをやめず、図書館を探し始めるという保証はあり.so.3ますか?

編集http2 ://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.htmlは、 「インターフェイスが変更されるたびにインクリメントされるバージョン番号」であると述べています。だから私はそれを推測します:

  • NSSのバージョンには、バージョン2のライブラリが必要です。
  • 更新されたNSSを使用したOSの更新では、異なるバージョン番号が必要になる場合があります。

誰かがそれが本当かどうか確認できますか?

4

2 に答える 2

3

あなたは、マイナーな編集で一般的に真実であると仮定しています:

  • NSSのバージョンには、インターフェイスバージョン2のライブラリのバージョンが必要です。
  • 更新されたNSSを使用したOSの更新では、異なるバージョン番号が必要になる場合があります。

インターフェイスのバージョンは、必ずしもライブラリのバージョンに合わせて変更する必要はありません。つまり、新しいバージョンのライブラリでも同じインターフェイスが提供される場合があります。

于 2012-11-23T14:54:25.933 に答える
2

soファイルには、共有ライブラリ(コンパイル時にシンボルをロードしてスキャンし、プログラムの起動時に再度ロードしてリンクする)とモジュール(実行時にロードしてリンクする)の2種類があります。共有ライブラリの考え方は、プログラムが特定のバージョンのライブラリを必要とするということです。このバージョンはコンパイル時に決定されます。プログラムがコンパイルされると、ライブラリの新しい(互換性のない)バージョンがインストールされた場合でも、プログラムは引き続き機能するはずです。つまり、新しいバージョンは別のファイルである必要があるため、新しい(または最近コンパイルされた)プログラムが新しいバージョンを使用している間も、古いプログラムは古いライブラリを使用できます。

このシステムを適切に使用するには、プログラムは、必要なライブラリバージョンが引き続きインストールされることを何らかの方法で確認する必要があります。これは、ディストリビューションのパッケージングシステムのタスクの1つです。プログラムを含むパッケージは、必要なバージョンのライブラリパッケージに依存している必要があります。

しかし、あなたはモジュールについて話しているようです。物事はそこで異なります。ld.so(共有ライブラリのロードを処理する)がそれらをロードするものではないため、それらはそのようなバージョンを持っていません。プログラムはこれらのモジュールにバンドルされている必要があります。これにより、モジュールのバージョンは、それらを使用するプログラムと常に互換性があります。これはほとんどのプログラムで機能します。

ただし、プログラムでサードパーティのモジュールが許可されている場合は機能しません。したがって、彼らは独自のバージョン管理システムを考え出すことができます。これはnssが行ったことのようです(私はそれに精通していませんが)。これは、モジュールがどのように見えるかを指定するプロトコルバージョン(現在は2)を定義していることを意味します。定義する必要のあるシンボル、関数が期待する引数、これらの種類のもの。プロトコルのバージョン2に従ってモジュールを作成する場合は、モジュールに.so.2という名前を付ける必要があります(サポートされているバージョンを確認する方法であるため)。互換性のない新しいプロトコル3を作成すると、.so.3の検索が開始されます。モジュールが見つからなくなります。新しいプロトコルもサポートされないため、これは良いことです。

于 2012-11-23T13:55:36.150 に答える