特定のディレクトリにあるすべての共有ライブラリをdlopen()します。これを行うには、
Linuxのライブラリ検索パスを取得する最もクリーンな方法は何ですか?または、そのパスに特定のディレクトリを見つけるためのより速い方法がありますか?
posixが良いでしょう。共有ライブラリの検索パスにあるディレクトリを見つける
答えて
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_64
とLD_LIBRARY_PATH_32
もあります。 HP-UXとAIXは、伝統的に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
など)変更されます。
解決策はプラットフォーム固有です。デフォルトの場所、読み込む環境変数、読み込む設定ファイル、および関連するファイル拡張子を決定する必要があります。ソースのいずれかで指定されたディレクトリごと
- :
- 開き、関連するサブディレクトリ(
opendir()
)- 読む各プログラミングだけの簡単な作業 - それらを考えると、それは主にSMOPですファイル名(
readdir()
)を順に返します。 - 関連ファイルのパスに
dlopen()
を使用します。 - あなたに関係するすべての分析を行います。
- 使用
dlclose()
- 読む各プログラミングだけの簡単な作業 - それらを考えると、それは主にSMOPですファイル名(
- 使用
closedir()
- 開き、関連するサブディレクトリ(
以下のコメントでもノートを参照してください...完全なトピックは、プラットフォームからプラットフォームへの変化と控えめに満ちています。
いくつかの追加情報は、答えに組み込むことを自由に感じてください:LD_PRELOADは、検索パスにあるものの代わりに使うべき特定のライブラリを指定することもできます。また、アプリケーションバイナリと開いているlibsは、見るべき追加のディレクトリを指定します。 Linux上のapp/libのRPATHには、 "objdump -p my_app_or_lib | grep RPATH"という文字列があります。 RPATHに慣れていない場合、リンク時にLDFLAGSに "-R/foo"を追加すると、リンカーは/ fooをバイナリに挿入し、ダイナミックリンカが/ fooでライブラリを探すようになります。 –
偉大な答え、ありがとうジョナサン。シンプルなものがこのように複雑になるはずですが、本当に奇妙です –
私はそれを行うことが可能であり、移植可能であるかどうかはわかりません。この質問は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)
を呼び出すとあなたはその後、ファイルを列挙することができます。
- 1. Apple App Groupの共有ディレクトリを見つける方法
- 2. パスの親ディレクトリを見つける
- 3. autoconfのライブラリ検索パスにディレクトリを追加する方法
- 4. valgrind - 共有ライブラリのメモリリークを見つける
- 5. Linuxで共有ライブラリのロードアドレスを見つける
- 6. sprofが私の共有ライブラリを見つける方法
- 7. C++パッケージ:共有ライブラリの依存関係を見つける
- 8. スタックトレースから共有ライブラリのソース行を見つける
- 9. 共有ライブラリの相対パス
- 10. Eclipse/mingw内の他のディレクトリにある共有ライブラリのデバッグ
- 11. ランパス検索パスは@ rpath/library.dylibであってもライブラリを見つけることができません
- 12. cygwin g ++リンカーが共有ライブラリを見つけられません
- 13. GNUリンカーがローカル共有ライブラリを見つけられません
- 14. パターン化された名前を検索する共有ライブラリ
- 15. XCodeのライブラリの検索パス
- 16. libstdC++のライブラリ検索パス
- 17. コンパイル時に実行時共有ライブラリの検索パスを実行可能ファイルに追加する|クラン| Ubuntu
- 18. 私のクロスコンパイラは共有ライブラリを見つけることができません
- 19. ロードされた共有ライブラリのバージョンをプログラムで見つける方法は?
- 20. 各ABIの異なるライブラリ検索パス
- 21. ELFファイルの共有ライブラリの絶対パス
- 22. ビジュアルスタジオのリポジトリにある共有ライブラリ
- 23. g ++は共有ライブラリを見つけることができません
- 24. WebRatio:コンパニオン共有ライブラリを見つけることができません
- 25. IDEがヘッダーファイルから共有ライブラリ名.soを見つける方法.h
- 26. Yocto- gccは共有ライブラリを見つけることができません
- 27. QtCreatorがローカル共有ライブラリを見つけることができません.so
- 28. Pythonのディレクトリ内の特定のパスを見つける
- 29. Ant:ディレクトリ内のファイルのパスを見つける
- 30. Makefileに共有ライブラリのパスを追加する
'LD_LIBRARY_PATH'のすべてのディレクトリにあるすべてのライブラリを' dlopen'したいのですか? –
いいえ、私は、LinuxのLD_LIBRARY_PATHを置き換えるもののすべてのディレクトリの特定のサブディレクトリにすべてのライブラリをdlopenすることを意味します。 –