2010-11-18 22 views
2

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

+0

'LD_LIBRARY_PATH'のすべてのディレクトリにあるすべてのライブラリを' dlopen'したいのですか? –

+0

いいえ、私は、LinuxのLD_LIBRARY_PATHを置き換えるもののすべてのディレクトリの特定のサブディレクトリにすべてのライブラリをdlopenすることを意味します。 –

答えて

5

POSIXは、共有ライブラリの検索パス上のディレクトリを検索するメカニズム(たとえば、LD_LIBRARY_PATHは必須ではありません)をサポートしていないので、すべての解決策は本質的に多少プラットフォーム固有です。

Linuxは、/etc/ld.so.confの内容に加えて、LD_LIBRARY_PATH環境変数のランタイム値に基づいているため、いくつかの問題があります。他のシステムにも同様の問題があります。デフォルトの場所もシステムによって異なります。/lib/usr/libは32ビットLinuxマシンでは通常ですが、少なくとも一部の64ビットマシンでは/lib64/usr/lib64が使用されています。ただし、他のプラットフォームでは、64ビットソフトウェアの他の場所を使用します。たとえば、Solarisは/lib/sparcv9/usr/lib/sparcv9を使用します(ただし、ドキュメントには/lib/64/usr/lib/64と記載されていますが、sparcv9ディレクトリへのシンボリックリンクです)。 Solarisには、環境変数LD_LIBRARY_PATH_64LD_LIBRARY_PATH_32もあります。 HP-UXとAIXは、伝統的にLD_LIBRARY_PATH - SHLIB_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など)変更されます。

解決策はプラットフォーム固有です。デフォルトの場所、読み込む環境変数、読み込む設定ファイル、および関連するファイル拡張子を決定する必要があります。ソースのいずれかで指定されたディレクトリごと

    • 開き、関連するサブディレクトリ(opendir()
      • 読む各プログラミングだけの簡単な作業 - それらを考えると、それは主にSMOPですファイル名(readdir())を順に返します。
      • 関連ファイルのパスにdlopen()を使用します。
      • あなたに関係するすべての分析を行います。
      • 使用dlclose()
    • 使用closedir()

以下のコメントでもノートを参照してください...完全なトピックは、プラットフォームからプラットフォームへの変化と控えめに満ちています。

+1

いくつかの追加情報は、答えに組み込むことを自由に感じてください:LD_PRELOADは、検索パスにあるものの代わりに使うべき特定のライブラリを指定することもできます。また、アプリケーションバイナリと開いているlibsは、見るべき追加のディレクトリを指定します。 Linux上のapp/libのRPATHには、 "objdump -p my_app_or_lib | grep RPATH"という文字列があります。 RPATHに慣れていない場合、リンク時にLDFLAGSに "-R/foo"を追加すると、リンカーは/ fooをバイナリに挿入し、ダイナミックリンカが/ fooでライブラリを探すようになります。 –

+0

偉大な答え、ありがとうジョナサン。シンプルなものがこのように複雑になるはずですが、本当に奇妙です –

1

私はそれを行うことが可能であり、移植可能であるかどうかはわかりません。この質問はLinuxに関するものなので、移植性が最も重要ではないかもしれません。それから私はPOSIXの制約を理解していません。明確にできますか?

おそらくLD_LIBRARY_PATHに加えて、スキャンは/etc/ld.so.confを含んman 8 ld.soで詳述検索機能を実装、または/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)を呼び出すとあなたはその後、ファイルを列挙することができます。

関連する問題