静态库中的隐藏符号
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
隐藏了它们静态库本身。
我有一个 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
隐藏了它们静态库本身。