6

foo経由でプラグインをロードできるプログラムがありますdlopen()。私はfoobar、サードパーティのライブラリによって提供される機能へのインターフェイスとなるプラグインを作成していますlibfoo

Linux では、次のfoobarようにビルドしています。

gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar

ここまでは順調ですね。

問題は、たとえばコードのバグやヘッダー ファイルとライブラリの不一致が原因で、未定義のシンボルが検出されないことです。リンクは成功し、後でプラグインをロードするとき、またはプラグインで何かを呼び出すときにのみエラーが発生します (dlopen()フラグによって異なります)。

共有ライブラリで未定義のシンボルを検出するには、通常は-Wl,-z,defsorを使用します-Wl,--no-allow-shlib-undefinedfooただし、実行時にプログラムで検出されるはずのシンボルも報告されるため、これは失敗します。ホスティング プログラムが提供するシンボル以外の未定義のシンボルを検出したいと考えています。

たとえば、Mac OS X では、これは-bundle_loaderオプションによって行われます。同等のリンク コマンドは次のようになります。

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo

そして、それは私が望む方法で未定義のシンボルを検出します。

GNU/Linux または GNU ld 一般にこれを行うにはどうすればよいですか? (man ページにリストされているすべてのオプションに目を通しましたldが、有望なものはありませんでした。)

4

1 に答える 1

0

私がこれを行う方法を知っている方法はありません。ただし、「foo」の構造が制御下にある場合は、「foo」内のすべてのロジックを適切なシンボルをエクスポートする新しい共有ライブラリに移動し、プラグインとメインラインの両方をそのライブラリにリンクすることができます。

于 2012-08-28T18:09:44.880 に答える