Linuxでは、共有ライブラリのバージョンはどのように制御されますか?

Linuxでは、共有ライブラリのバージョンはどのように制御されますか?

SEやその他のチュートリアルでは、これについて矛盾する情報をたくさん受け取りました。ほとんどの人は、バージョンが意味論的なバージョンだと思うようです。それから他の人はそれが必ず従うべきだと訂正しました。libtoolsルール-version-info C:R:A、libtoolsに渡された番号がというファイルを生成すると暗黙的に仮定または暗黙的にしますlibfoo.so.C.R.A。ただし、libtoolsのマニュアルには、ファイルの命名方法が明示的に記載されている内容は表示されません。これは私が見ている動作と一致しません。 。

私はサードパーティのパッケージ(gdal)をビルドしていてビルド中に呼び出しますlibtool --mode=link -version-info 25:4:5 <many other arguments>が、ビルド後に.libsに残っているsoファイルのバージョンはlibgdal.20.5.4です。

私は同じライブラリの異なるバージョンを試しましたが、すべて同じパターンに従うようです。 libtoolsを呼び出すと、生成されるcurrent:revision:ageが渡されますlibfoo.so.current-age.age.revision。これによりsonameはlibfoo.so.current-age常にになります。最低限度で他の投稿が提案した最大バージョンではなく、このライブラリが互換性のあるバージョンです。

RHEL 7とDebian 10でこれをテストしました。

これが仕事が進む方法ですか?この図書館何か奇妙なことをしているのでしょうか?これが権威ある、または少なくとも正確に文書化できる場所はありますか?

ベストアンサー1

Linuxの一般的な期待は、共有ライブラリがlibfoo.so.NNが整数の形式を持つことです。また、使用する規則(libtoolなど)に応じて、追加の意味を持つことができる追加の整数を持つ形式を持つこともできます。他のフォームを使用でき、一部のライブラリ(OpenSSLなど)は他のフォームを使用できます。

Linuxでは、正しい共有ライブラリの一部は、SONAMEバイナリの共有オブジェクト名を指定するELFエントリです。たとえば、libzの場合:

$ readelf -a /lib/x86_64-linux-gnu/libz.so.1 | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libz.so.1]

この場合、SONAMEがあることがわかりますlibz.so.1。バイナリがこの共有ライブラリにリンクされると、NEEDEDセクションが含まれます。動的リンカーが共有ライブラリを解析すると、検索パスでSONAMEと同じ名前の共有ライブラリが見つかります。たとえば、Gitには4つの共有ライブラリが必要です。

$ readelf -a /usr/bin/git | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libpcre2-8.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

したがって、実際に重要なのは、意味論的にバージョン化されたスニペットのメジャーバージョンに対応するSONAMEに何があるかです。 SONAME(通常は次の整数)の値を変更せずに共有ライブラリで互換性のない変更を実行することは、怒っているユーザーのグループがプロジェクトに参加できるようにする深刻な間違いです(そしてもちろんそうです)。

したがって、SONAMEの一部ではない共有ライブラリの部分は重要ではありません。 libtoolルールとセマンティックバージョン管理ルールの両方は、.so名前部分の後の最初の整数を互換性のない変更のバージョンとして扱い、両方とも同じことを行います。これは通常SONAMEに存在する部分なので、この目的と同じです。

いくつかの共有ライブラリが別のタスクを実行すると述べました。たとえば、OpenSSLはSONAMEを共有ライブラリとして保持しlibssl.so.1.1て使用します。libcrypto.so.1.1これは推奨されるルールではありませんが、機能します。しかし、人々が混乱しているので、将来のバージョンではセマンティクスのバージョン管理に変わります。

おすすめ記事