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

Posted

技术标签:

【中文标题】C++ -fvisibility=hidden -fvisibility-inlines-hidden【英文标题】: 【发布时间】:2011-04-03 23:26:58 【问题描述】:

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

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

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

谁能帮帮我。

【问题讨论】:

【参考方案1】:

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

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

例如

void __attribute__((visibility("default"))) Exported()

    // ...

【讨论】:

当然你会想要创建一个像MYLIB_PUBLIC这样的宏或者类似的东西来让这个更干净。【参考方案2】:

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

考虑一个具有 10,000 多个符号(函数/全局变量)的共享对象,但其中只有 100 个是库用户可以访问的公共函数。我们可以将仅有的 100 个函数设为对其他人可见,并将剩余的 9,900 个符号设为私有。

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

【讨论】:

这是一个很好的答案,但如果我将-fPIC -no-plt 与链接器选项一起使用:-z now -z retro 会怎样?这样,延迟加载就被完全禁用了。搬迁也是如此。

以上是关于C++ -fvisibility=hidden -fvisibility-inlines-hidden的主要内容,如果未能解决你的问题,请参考以下文章

hidden="hidden",display:none, visibility:hidden 三者的区别

hidden是啥意思

.hidden = YES 工作,但 .hidden = NO 不工作

请问HTML里面的hidden是啥意思???做啥用的

关于HTML隐藏域hidden和id标记!

关于overflow:hidden的作用