2012-02-06 6 views
1

dlopen()で開かれたライブラリへのパスを判断するための移植性のある(POSIX)方法を探しています。 dl_iterate_phdr()dladdr()のような機能は移植できません。dlopenで開かれた動的ライブラリへのパスを決定するポータブルな方法

一部manページの詳細開くためのライブラリを検索するdlopen()で撮影したパス(ld.so.cacheLD_LIBRARY_PATH、/ libには/ usr/libに、...)ので、これらのディレクトリのすべてのをチェックすることはできますが、ことができませんでしたポータブル。たとえば、Linuxでは、ld.so.cacheを解析する方法が必要ですが、Mac OS Xではそのような概念はありません。

一般的なケースではdlopenを使用していないため、私がこれをやりたい理由については、previous questionを参照してください。

答えて

3

あなたが移植性を持たせたいと思う方法はありません。実際にdlopenを絶対パスなしで使用することは悪い考えです。また、dlopenがロードされるモジュール以外のものについては、悪い考え方を使用することをお勧めします(自分のプロジェクト自体またはアプリケーションが使用する別のライブラリ)。システムライブラリの検索パスとライブラリに "already present"というライブラリを使用すると、間違ったバージョンや同じ名前の間違ったライブラリを読み込む重大な危険が生じます。 dlopenに絶対パスを渡している限り、どのファイルがロードされたか正確に知ることができます(または、ロードする前にがロードされるファイルを正確に知ることができます)。 、絶対パスが進むべき道であるよう

この答えは、おそらくあなたはより良いあなたが達成しようとしているかを説明でき、解決しない場合は...

+0

は聞こえるが、一つは、絶対パスが正しいことを確認する必要があります'dlopen'は検索パスを別の方法で開始するからです。私が達成したいことについての明確な詳細については、http://stackoverflow.com/questions/9038303/programatically-determine-shared-libraries-in-use-by-running-applicationをご覧ください。 – greg

+1

OK、 'LD_LIBRARY_PATH'はあなたが行っていることに対して正しいアプローチではありません。代わりに、生徒の共有ライブラリファイルの絶対パス名をプログラムに渡すだけで、完全パス名でロードすることができます。 –

+1

@greg:指定された名前に "/"文字が含まれていない場合、dlopenはライブラリパスのみを検索します。 "/"が含まれていれば、ファイルパスとして扱われ(直接オープンに渡されます)、そのファイルが終了しなければ他の場所は見えません。 –

2

簡単な答えはないということです。これは、 WindowsがUnixに先立っている場所です。

関連する問題