2012-01-09 17 views
5

ここに問題があります:GCCでは、すべてのシンボルをエクスポートせずに、共有ライブラリのすべてのtypeinfoシンボルをどのようにエクスポートできますか?

私はデフォルトでシンボルを隠している共有ライブラリを持っています。実際には、-Xlinker --version-script =オプションを使用して、特定のファイル内のシンボルをいくつかエクスポートしますが、残りのすべてを非表示にします。問題は、他の共有ライブラリで定義されている例外をキャッチしようとすると、この共有ライブラリによってtypeinfoが隠されているため、問題が発生するということです。例外クラスは私のコントロール外のオープンソースライブラリで定義されているため、明示的に表示することはできません。また、バージョン・スクリプト・シンボル・ファイルに例外クラスのtypeinfoの名前を明示的にリストしたくないのは、このライブラリを扱う多くの開発者がいるためです。未来。

オープンソースの.hppファイルの前に#pragma GCC可視性プッシュ(デフォルト)を使用しようとしましたが、動作していないようです。シンボルは表示されませんでした。

私はまた、typeinfoシンボルをエクスポートしただけでなく、エクスポートしたくない他のシンボルをエクスポートした-fvisibility-ms-compatを使ってみました。ライブラリにはCとC++の両方のコードがありますので、C++のみのこのオプションでどのように動作するはずです。

私が本当に必要とするのは、すべてのtypeinfoシンボルを表示するオプションです(明示的に表示されていない限り、他のシンボルは非表示にします)。このようなオプションはありますか?

+0

おそらく ' nmのようなものか?ちょうど推測。 –

+0

これは良い方法かもしれません。私はそれについて考えていましたが、私は余分なスクリプト作業が嫌いですが、それは最良の答えかもしれません。あなたの提案をありがとう! –

答えて

2

あなたの質問に対する最も直接的な答えは、ldオプション--dynamic-list-cpp-typeinfoを試してみることです。私はその選択肢で運が良かったのですが、YMMVです。

ビルドしているプラ​​ットフォームについては言及していません。外見上は、あなたは-fvisibility-ms-compatを試したので、mingwを使っています。 Linuxのように実際にELFのターゲットになっている可能性がある場合は、バージョンスクリプトからシンボルワイルドカード_ZTI*_ZTN*をエクスポートしてみてください。 (おそらくWindowsでも同様のことができますが、Visual C++の名前のマングリングが実際には書かれていない限り、私は使用できる缶詰のワイルドカードは認識していません)。

関連する問題