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

时间:2010-08-25 21:28:10

标签: c++ linux visibility gnu dynamic-linking

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

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

您打算如何链接共享库呢?有特殊的方式吗?如果我链接它通常如何链接它不起作用。

请有人帮助我。

2 个答案:

答案 0 :(得分:29)

-fvisibility=hidden默认隐藏所有符号

您必须做的是选择您希望对链接到您的库的用户可见的功能,并通过使用可见属性标记它们使其可见。

E.g。

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

答案 1 :(得分:4)

它减少了保留共享对象专用的不必要的符号信息。

考虑一个共享对象,它有超过10,000个符号(函数/全局变量),但只有100个是可以从库用户访问的公共函数。我们可以将其他100个功能视为其他人可见的功能。其余9,900个符号为私人。

它也会减少共享对象的大小,因为它的重定位表只有100个符号信息。使用此标志以及 -ffunction-sections -fdata-section 将通过使该定义与该100个符号相关来进一步减少共享对象的大小。