2

C++ で書かれた巨大なプロジェクトがあります。それはすべて複数の静的ライブラリに分割され、それらは最終的に 1 つの最終的な共有ライブラリにリンクされ、いくつかの単純な関数のみをエクスポートする必要があります。

その最終的な.soのobjdumpを実行すると、すべての内部名などが表示されます。長いクラス名と名前空間を使用するため、これらの文字列が非常に長くなり、結果として最終的なバイナリが大きくなります。

それで、私の質問は、これらすべての内部関数が最終的なバイナリに表示されないようにするために、GCC で適切に行うにはどうすればよいですか?

これらすべての GCC 固有の可視性修飾子については認識しており、-fvisibility=hidden -fvisibility-inlines-hidden を使用します。C++ の例外と rtti を無効にします (-fno-exceptions -fno-rtti) が、GCC に最終的な .so を生成させることができません。これには、そこにあるはずのない名前空間とクラスの名前が含まれていません。全て!

-Wl,--version-script= を使用してどの関数を表示するかを制御しようとしましたが、最終的に削除された共有オブジェクトに多くの内部名が表示されます。SOで複数の同様のエントリを読みましたが、仕事をするものは何も見当たりません。注: 複数のプラットフォーム (Linux、Windows、iPhone など) 用にコンパイルしますが、VS のウィンドウでのみ問題はありません。

ありがとう

4

1 に答える 1

4

--retain-symbols-file最終的な .so ファイル ( ) をリンクするときにリンカー オプションを試して、-Wl,--retain-symbols-file=filename保持 (エクスポート) したいシンボルだけを指定し、それ以外はすべて削除することをお勧めします。このファイルは、保持するシンボル (1 行に 1 つ) を含む単なるテキスト ファイルです。

于 2011-09-29T18:38:51.543 に答える