誰かが私に、「私はライブラリをロードするときにLinuxでシンボリックリンクが使用されていないことを知っています」と言いました。
しかし、これは私にとって正しいようではありません。 Linuxを使用すると、壊れたシンボリックリンクを修正する必要があることがよくあります。
シンボリックリンク、仕組み、作成方法に関する情報を見つけることができます。
共有ライブラリと静的ライブラリに関する情報と機能を見つけることができます。
ただし、ライブラリをロードするときにシンボリックリンクを使用するライブラリのロードプロセスを説明するドキュメントが見つかりません。特に複数のバージョンのライブラリがある場合はさらにそうです。
Linuxでライブラリをロードするためにシンボリックリンクを使用する方法を説明するドキュメントを教えてくれる人はいますか?
修正する
調査した結果、この人は.so
ライブラリをロードするときにシンボリックリンクを使用しないという意味だと思います。
答え1
2つの概念が異なる抽象化レベルで実装されているため、動的ライブラリがシンボリックリンクを使用する方法を説明する文書を見つけることはできません。シンボリックリンクはファイルシステムに属し、アプリケーションとダイナミックライブラリに透過的です。プログラムでは、ファイルは実際のファイルであるかシンボリックリンクであるかに関係なく、ファイルです。すべての内部タスクは、オペレーティングシステムのカーネル内に隠されています。
答え2
知っていると、ライブラリのリンクプロセスを理解していないようです。
コンパイル後にライブラリがプログラムにリンクされると、バージョンではなく.so.XX
ライブラリの名前(通常はXXがバージョン番号のファイル)にリンクされます.so
。
ldd
アプリケーションを実行すると、以下が表示されます。
> ldd /opt/GSix/bin/MyApplication
linux-vdso.so.1 (0x00007ffcefff0000)
/usr/lib64/libsyslognb.so (0x00007fe1eacbc000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe1eaab4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe1ea897000)
libQt5Widgets.so.5 => /usr/local/Trolltech/Qt-5/lib/libQt5Widgets.so.5 (0x00007fe1e99f5000)
libQt5Gui.so.5 => /usr/local/Trolltech/Qt-5/lib/libQt5Gui.so.5 (0x00007fe1e9143000)
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5/lib/libQt5Core.so.5 (0x00007fe1e894d000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fe1e85d2000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe1e82d4000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe1e80c2000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe1e7d24000)
各ライブラリには、.so
メジャーバージョンを指す.so.X
シンボリックリンクバージョンがあります。ただし、ldd
アプリがその.so
バージョンに接続されていないとマークされます。
これは、複数のバージョンのライブラリをシステムにインストールでき、各アプリケーションが他のバージョンと競合せずに必要なバージョンのみをロードするために意味があります。
たとえば、カールライブラリは次のようになります。
16 libcurl.so -> libcurl.so.4
16 libcurl.so.4 -> libcurl.so.4.4.0
387K libcurl.so.4.4.0
16 libcurl.so.3 -> libcurl.so.3.1.0
387K libcurl.so.3.1.0
MyApplicationがバージョン4に接続され、YourApplicationがバージョン3に接続されているとします。
両方のアプリケーションがlibcurl.soを探している場合、YourApplicationはlibcurl.so
.soへのシンボリックリンクであるためロードされませんlibcurl.so.4
。
これがアプリケーションが.so.X
バージョンではなくバージョンをロードする必要がある理由です.so
。