我对C ++可见性属性有疑问。我读过http://gcc.gnu.org/wiki/Visibility,但我不太明白它是如何工作的。
我想在我拥有的一些共享库中隐藏可见性。我相信这意味着符号被隐藏了吗?
您打算如何链接共享库呢?有特殊的方式吗?如果我链接它通常如何链接它不起作用。
请有人帮助我。
答案 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个符号相关来进一步减少共享对象的大小。