特定のディレクトリ内のすべての共有ライブラリに dlopen() が必要です。そのために、
Linux のライブラリ検索パスを取得する最もクリーンな方法は何ですか。または、そのパスで特定のディレクトリをすばやく見つける方法はありますか?
posixの方が良いでしょう。
2 に答える
POSIX は、共有ライブラリの検索パス上のディレクトリを見つけるメカニズムをサポートしていません (LD_LIBRARY_PATH
たとえば、必須ではありません)。
Linux では、使用される値が環境変数の内容や/etc/ld.so.conf
実行時の値に基づいている可能性があるため、いくつかの問題があります。LD_LIBRARY_PATH
他のシステムには、同等の問題があります。デフォルトの場所もシステムによって異なります.32ビットのLinuxマシンでは通常の場所ですが/lib
、少なくとも一部の64ビットのマシンで使用されています. ただし、他のプラットフォームでは、64 ビット ソフトウェアに別の場所が使用されます。たとえば、Solaris ではandを使用します (ドキュメントでは and に言及していますが、ディレクトリへのシンボリック リンクです)。Solaris には、環境変数と. HP-UX と AIX は伝統的に--と--以外の変数を使用します。/usr/lib
/lib64
/usr/lib64
/lib/sparcv9
/usr/lib/sparcv9
/lib/64
/usr/lib/64
sparcv9
LD_LIBRARY_PATH_64
LD_LIBRARY_PATH_32
LD_LIBRARY_PATH
SHLIB_PATH
LIBPATH
、IIRC - AIXも現在使用していると思いますLD_LIBRARY_PATH
が。また、Solaris では、共有ライブラリを構成するためのツールは「crle」 (ランタイム リンク環境の構成) であり、その類似物/etc/ld.so.conf
は または のいずれ/var/ld/ld.config
か/var/ld/64/ld.config
です。もちろん、共有ライブラリの拡張子もさまざまです ( .so
、.sl
、.dylib
、.bundle
など)。
したがって、ソリューションはプラットフォーム固有になります。デフォルトの場所、読み取る環境変数、読み取る構成ファイル、および関連するファイル拡張子を決定する必要があります。それらを考えると、それは主に SMOP - Simple Matter Of Programming:
- いずれかのソースによって名前が付けられたディレクトリごとに:
- 関連するサブディレクトリを開きます (
opendir()
)readdir()
各ファイル名 ( ) を順番に読み取りますdlopen()
関連ファイルのパスで使用します。- あなたに関連するあらゆる分析を行います。
- 使用する
dlclose()
- 使用する
closedir()
- 関連するサブディレクトリを開きます (
以下のコメントのメモも参照してください...完全なトピックには、プラットフォームごとのバリエーションが多少含まれています。
それが可能で、移植可能かどうかはわかりません。この質問は Linux に関するものなので、移植性は最優先事項ではないかもしれません。次に、POSIX 制約がわかりません。明確にしていただけますか?
man 8 ld.so
に加えて /etc/ld.so.conf のスキャンを含む、 で説明されている検索機能を実装するかLD_LIBRARY_PATH
、必要/lib/ld.so
な処理を実行して出力を解析する必要があります。そのための正確ではないコマンドラインは次のようになります。
export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD
その後、POSIX 呼び出しopendir(3)
とreaddir(3)
.