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 三者的区别