web-dev-qa-db-ja.com

C ++ -fvisibility = hidden -fvisibility-inlines-hidden

C++の可視性属性について質問があります。 http://gcc.gnu.org/wiki/Visibility を読みましたが、それがどのように機能するのかよくわかりません。

所有している共有ライブラリの一部で可視性を非表示にしたいと思います。これはシンボルが隠されていることを意味すると思いますか?

では、共有ライブラリをどのようにリンクするつもりですか?特別な方法はありますか?通常のリンク方法でリンクすると、機能しません。

誰か助けてくれませんか。

18
nixgadget

-fvisibility=hiddenすべてのシンボルを非表示にしますデフォルト

次に行う必要があるのは、ライブラリにリンクしているユーザーに表示する関数を選択し、それらをvisible属性でマークして表示することです。

例えば。

void __attribute__((visibility("default"))) Exported()
{
    // ...
}
31
CB Bailey

共有オブジェクトにプライベートな不要なシンボル情報を保持することを減らします。

10,000を超えるシンボル(関数/グローバル変数)を持つ共有オブジェクトについて考えてみますが、ライブラリユーザーがアクセスできるパブリック関数はそのうちの100個だけでした。 100個の関数のみを他のユーザーに表示し、残りの9,900個のシンボルをプライベートにすることができます。

再配置テーブルには100シンボルの情報しかないため、共有オブジェクトのサイズも小さくなります。このフラグを-ffunction-sections -fdata-sectionsと一緒に使用すると、これらの100個のシンボルに関連する定義を持つことで、共有オブジェクトのサイズがさらに小さくなります。

4