2

.soプラグインをロードする実行可能ファイルがあります。

-rdynamicシンボル コールバックが発生するように、実行可能ファイルがリンクされます。

実行可能ファイルに含まれている静的ライブラリがあります。これにはBLAH_hello().a

スタティック ライブラリは実行可能ファイルでは使用されませんBLAH_hello()つまり、実行コード内にへの呼び出しはありません。

ただし、 に.soは への呼び出しがありますBLAH_hello()

dlopen().so未定義のシンボルについて不平を言うときBLAH_hello()

BLAH_hello()のように、実行可能コードにダミーの呼び出しを含めるとBLAH_hello(NULL); . シンボルは実行可能ファイルに含まれており、.soロード時にシンボルが検出されます。

をリンクすることもできると確信.soして.aいますが、動的にロードされた複数の が呼び出しを.so使用するBLAH_helloため、実行可能ファイルに含めることは理にかなっています。ライブラリをそれぞれにリンクすると、シンボルの競合も心配です.so

だから私が疑問に思っているのは、実行可能ファイルで実際に使用さ.aれていなくても、実行可能ファイルにシンボルを取得する方法ですか?

4

3 に答える 3

4

.so を dlopen() すると、BLAH_hello() への未定義のシンボルについて不平を言う

BLAH_hello(NULL); のように、実行可能コードに BLAH_hello() へのダミー呼び出しを含めるとします。シンボルは実行可能ファイルに含まれており、.so が読み込まれるとシンボルが検出されます。

それは完全に正常であり、予想されます。これは、リンカーがアーカイブ ライブラリを操作する方法です。

メインの実行ファイルに含める必要がある場合は、実行ファイルのリンク行BLAH_helloに追加してください。-Wl,-u,BLAH_hello

于 2011-07-24T16:56:07.263 に答える
1

@nbt:

をリンクする.soこと.aは、明白で正しいことです。

これにより、実行可能ファイルにロードするときにシンボルの競合が発生することはありません.so

于 2011-05-27T15:16:23.630 に答える