静态库中的隐藏符号

hidding symbols from a static library

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

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

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

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