SO(共有オブジェクト)番号はどのように機能しますか?

SO(共有オブジェクト)番号はどのように機能しますか?

Linuxでは、共有オブジェクトが「so number」を使用していることがわかります。つまり、共有オブジェクトの異なるバージョンには異なる拡張子が付与されます。たとえば、次のようになります。

  • example.so.1
  • example.so.2

私は、2つのバージョンのライブラリがシステムに(Windowsの「DLL Hell」の代わりに)存在するように、2つの異なるファイルを持つアイデアを理解しています。これが実際にどのように機能するのか疑問に思います。私はこれが実際にexample.so最新バージョンへのexample.so.2シンボリックリンクであることをよく見ます。.2それでは、以前のバージョンを使用しているアプリケーションはどのようにexample.soそれを正しく識別しますか?どの番号を使用すべきかを規定する規則はありますか?それともこれはコンベンションだけですか?システム間でソフトウェアバイナリが転送されるWindowsとは異なり、システムに最新バージョンの共有オブジェクトがある場合、ソースからコンパイルすると自動的に古いバージョンにリンクされますか?

私はこれが関連していると思いますldconfigが、どうなるかはよくわかりません。

ベストアンサー1

バイナリ自体は、自分が依存する共有ライブラリのバージョンを知り、具体的に要求します。ldd以下を使用して依存関係を表示できますls

$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb784e000)
    librt.so.1 => /lib/librt.so.1 (0xb782c000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
    libc.so.6 => /lib/libc.so.6 (0xb76dc000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
    /lib/ld-linux.so.2 (0xb784f000)
    libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)

ご覧のとおり、これはlibpthread.so.0単なるものではありませんlibpthread.so


シンボリックリンクを使用する理由はリンカのためです。直接接続する場合は、フラグをlibpthread.so指定するとプレフィックスとサフィックスが自動的に追加されます。サフィックスを追加するように指示できないため、シンボリックリンクは追加を容易にするために最新バージョンのライブラリを指します。gcc-lpthreadlib.so.so.0

おすすめ記事