27

我对 C++ 可见性属性有疑问。我已经阅读了http://gcc.gnu.org/wiki/Visibility,但我不太明白它是如何工作的。

我想使用可见性隐藏在我拥有的一些共享库中。我相信这意味着符号是隐藏的?

那么你打算如何链接共享库呢?有什么特别的方法吗?如果我链接它通常如何链接它不起作用。

有人能帮助我吗。

4

2 回答 2

47

-fvisibility=hidden默认情况下隐藏所有符号。

然后您要做的是选择您希望链接到您的库的用户可以看到哪些功能,并通过使用可见属性标记它们来使它们可见。

例如

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 回答