文章

共享库中符号的可见性

在很多开源库中总是能看到在函数开头有一句 __attribute__ ((visibility("hidden"))) 或者 __attribute__ ((visibility("default"))),这样做有什么作用呢?其实这个是指定 API 的可见性,可以更细致地控制库的 API,提高库的封装性。这在创建共享库时尤其重要,因为它允许库的作者明确地指定哪些符号是公开的,哪些符号是私有的。

介绍

  • __attribute__ ((visibility("default"))) 当你给一个符号(比如函数或变量)标记为 “default” 可见性时,这个符号可以被不同的共享库或可执行文件访问。这是共享库中公共接口的默认行为。这意味着其他链接到这个库的代码可以链接到这个符号,就像它是导出的一样。

  • __attribute__ ((visibility("hidden"))) 当你给一个符号标记为 “hidden” 可见性时,这个符号在定义它的共享库之外是不可见的。即使这个符号的声明在其他模块中是可见的,链接器也不会将这些模块的引用解析到这个符号。这对于隐藏库内部的实现细节非常有用,可以减少符号冲突的可能性,并可能减小生成的二进制文件的大小,因为隐藏的符号不需要导出。

本文由作者按照 CC BY 4.0 进行授权

© ziqing. 保留部分权利。

纸上得来终觉浅,绝知此事要躬行!