27

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

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

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

誰かが私を助けてくれませんか。

4

2 に答える 2

47

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

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

例えば

void __attribute__((visibility("default"))) Exported()
{
    // ...
}
于 2010-08-25T21:37:29.487 に答える
7

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

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

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

于 2013-01-21T05:04:39.447 に答える