2

特定のディレクトリ内のすべての共有ライブラリに dlopen() が必要です。そのために、
Linux のライブラリ検索パスを取得する最もクリーンな方法は何ですか。または、そのパスで特定のディレクトリをすばやく見つける方法はありますか?
posixの方が良いでしょう。

4

2 に答える 2

7

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/64sparcv9LD_LIBRARY_PATH_64LD_LIBRARY_PATH_32LD_LIBRARY_PATHSHLIB_PATHLIBPATH、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()

以下のコメントのメモも参照してください...完全なトピックには、プラットフォームごとのバリエーションが多少含まれています。

于 2010-11-21T01:35:04.473 に答える
1

それが可能で、移植可能かどうかはわかりません。この質問は 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).

于 2010-11-20T20:40:23.167 に答える