2017-11-15 7 views
2

バイナリ自体にC++バイナリが動的にリンクされているライブラリの名前を確認またはアクセスする方法はありますか?実行時にC++共有依存関係を確認する(自分自身でldd)

lddを実行せずに、基本的にはlddをバイナリで実行します。

このユースケースはdlopenからdlfcn.hを使用しています。私は"@[email protected]"がパスに解決

void* handle = dlopen("@[email protected]", RTLD_LAZY | RTLD_GLOBAL); 

を呼び出したい私はlibpythonにリンクされているC++ライブラリを持っていますが、そのlibpython3.5m.so場合、私はなど、libpython2.7.solibpython3.4m.soを知らない...

モジュールが現在動的にリンクされている現在のlibpythonに置き換えます。

これを行う方法はありますか?

+0

libpython3.5m.so、次にlibpython3.4m.so、次にlibpython2.7.so ...が成功するまで試してみませんか? –

+1

@ Jean-FrançoisFabre私はそれがうまくいくとは思わない...間違ったライブラリをロードする可能性がある –

答えて

2

私はおそらく、あなたがしてdlsym(handle, "SomePythonSymbol")を呼び出したいvoid *handle = dlopen("...", ...)

を呼びたいです。

これはの意味がありませんすることです。動的ルックアップを実行する代わりに、SomePythonSymbolを直接呼び出すだけです。

元の「どのバージョンのlibpythonにリンクしていますか?」という質問に答えるには、GLIBCベースのシステムでdl_iterate_phdrを使用して、現在ロードされている共有ライブラリをすべて列挙します。

すでにlibpythonで定義されていることがわかっているシンボルを持っている場合は、dladdr1はライブラリの検索をさらに容易にします。

+0

pybind11プラグインをロードするときは無意味ではないことが判明した。 dlopenを呼び出さないと、ctypesのようなモジュールをインポートするPythonコードを実行するときに、PyFloat_Typeなどの問題が発生する可能性があります。私はこれまで「dlsym」と呼ぶ必要はない。しかし、dl_iterate_phdrはまさに私が探していたもののようです。 – Erotemic

+0

@Erotemic何が間違っているのあなたの説明は私には意味をなさない。既に 'libfoo.so'とリンクされている場合、' dlopen( "libfoo.so"、RTLD_LAZY)を呼び出すことは確かにno-opです。私はこのような 'dlopen'が違いを生むhttps://stackoverflow.com/help/mcveを見るのが好きです。 –

+0

@Erotemic 'man dladdr1'も参照してください。回答が更新されました。 –

0

Linuxの場合、/proc/self/mapsまたは/proc/self/map_filesを読むことができますが、これは他のプラットフォームには移植できません。

関連する問題