首页 > 解决方案 > 从静态库中隐藏符号

问题描述

我有一个 c++ 共享库 - libA.so. -fvisibility=hidden我使用标志隐藏符号。应该可见的符号具有以下属性:__attribute__ ((visibility ("default"))). 该库链接到静态库 - libB.a. 该静态库 ( ) 中的所有符号libB.a应仅对共享库 ( libA.so) 可见。我也用 flag 编译了静态库-fvisibility=hidden。我得到了想要的结果 - 来自的符号libB.a只对外界可见libA.so但对外界隐藏,例如以下命令nm -C libA.so不显示来自libB.a.

您能解释一下-fvisibility=hidden在上述场景中标志如何在内部与静态库一起工作吗?

标签: c++shared-librariesstatic-librariessymbolsvisibility

解决方案


添加了可见性功能以支持共享库的限制接口,即减少导出函数的数量。默认情况下(不带-fvisibility=hidden)链接器将导出库中的所有函数,在大多数情况下,这不是您想要的。

在静态库链接期间,可见性被忽略,即当libB.a从它链接和拉取函数时,链接器根本不会查看可见性注释。另一方面,在函数被(从libB.a)拉入最终共享库(libA.so)之后,它们将被导出并污染 libA 的接口,除非您-fvisibility=hidden在编译静态库本身时隐藏了它们。


推荐阅读