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,defs
orを使用します-Wl,--no-allow-shlib-undefined
。foo
ただし、実行時にプログラムで検出されるはずのシンボルも報告されるため、これは失敗します。ホスティング プログラムが提供するシンボル以外の未定義のシンボルを検出したいと考えています。
たとえば、Mac OS X では、これは-bundle_loader
オプションによって行われます。同等のリンク コマンドは次のようになります。
gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo
そして、それは私が望む方法で未定義のシンボルを検出します。
GNU/Linux または GNU ld 一般にこれを行うにはどうすればよいですか? (man ページにリストされているすべてのオプションに目を通しましたld
が、有望なものはありませんでした。)