共享库中符号的可见性
在很多开源库中总是能看到在函数开头有一句 __attribute__ ((visibility("hidden")))
或者 __attribute__ ((visibility("default")))
,这样做有什么作用呢?其实这个是指定 API 的可见性,可以更细致地控制库的 API,提高库的封装性。这在创建共享库时尤其重要,因为它允许库的作者明确地指定哪些符号是公开的,哪些符号是私有的。
介绍
__attribute__ ((visibility("default")))
当你给一个符号(比如函数或变量)标记为 “default” 可见性时,这个符号可以被不同的共享库或可执行文件访问。这是共享库中公共接口的默认行为。这意味着其他链接到这个库的代码可以链接到这个符号,就像它是导出的一样。__attribute__ ((visibility("hidden")))
当你给一个符号标记为 “hidden” 可见性时,这个符号在定义它的共享库之外是不可见的。即使这个符号的声明在其他模块中是可见的,链接器也不会将这些模块的引用解析到这个符号。这对于隐藏库内部的实现细节非常有用,可以减少符号冲突的可能性,并可能减小生成的二进制文件的大小,因为隐藏的符号不需要导出。
本文由作者按照 CC BY 4.0 进行授权