未定義バージョンのライブラリへの接続はいつ正しい選択ですか?

未定義バージョンのライブラリへの接続はいつ正しい選択ですか?

straceプログラムに指定されていない一部のライブラリバージョンが必要であることがわかりましたgmp

open("/lib/x86_64-linux-gnu/libgmp.so", O_RDONLY|O_CLOEXEC) = \
   -1 ENOENT (No such file or directory)

特定のインターフェイスバージョン(たとえばlibgmp.so.10)に接続する必要があると思います。

ところで、このようなことが一般的なことではないようです。これは偶然ですか、それとも指定されていないバージョンを使用するのに適した理由がありますか?

私が考えることができる唯一の許容可能な状況は、オペレーティングシステムの展開です。つまり、各パッケージをビルド(および制御)します。

答え1

「許可できない」とは言えませんが、実行時にバイナリが一般名で共有ライブラリを検索することは確かにまれです*.so。通常:

  • (ビルド時間) リンカは、名前が一致するライブラリを検索します。*.so
  • 見つかった場合、リンカはライブラリのSONAMEフィールドにクエリを実行し、実行時にライブラリが配置されなければならない名前を見つけます。
  • 実行時に検索する名前になるようにビルドされたバイナリにその名前を記録します。

このルールの目的は、バイナリを特定のAPIバージョンのライブラリにバインドできるようにすることです。

問題のライブラリがこの規則を使用しない可能性があります。ライブラリにSONAMEフィールドが含まれていることを確認するには、次の手順を実行します。

objdump -p /lib/`arch`-linux-gnu/libthing.so | fgrep SONAME

SONAMEが存在しない場合、ライブラリに関連付けられたバイナリはデフォルトでビルド時にライブラリが見つかった名前(SONAMEなど*.so)を使用します。これはおそらくあなたが見ているものです。 SONAMEがある場合は、ライブラリに関連付けられているバイナリは実行時にその名前を使用する必要があります。

関連情報