Linux 将静态库链接到共享库时是否应隐藏符号?

Linux 将静态库链接到共享库时是否应隐藏符号?,linux,gcc,linker,static-linking,dynamic-linking,Linux,Gcc,Linker,Static Linking,Dynamic Linking,编写共享库时,通常建议隐藏所有内部符号以减少动态链接时间,通常使用链接器脚本或-fvisibility选项 在我的例子中,共享库与两种类型的其他库链接: 内部静态库 第三方静态库(如libuv) 它们都使用-Wl,--whole archive选项链接到共享库中,因此生成的共享库是自给自足的,并且只链接到stdlib 内部静态库中的所有符号都是隐藏的,因为它们不是公共API的一部分 问题是对第三方静态库隐藏符号的利弊是什么?是否有任何最佳实践和已知的陷阱?一方面,它们不是我的库的公共API的

编写共享库时,通常建议隐藏所有内部符号以减少动态链接时间,通常使用链接器脚本或
-fvisibility
选项

在我的例子中,共享库与两种类型的其他库链接:

  • 内部静态库
  • 第三方静态库(如libuv)
它们都使用
-Wl,--whole archive
选项链接到共享库中,因此生成的共享库是自给自足的,并且只链接到stdlib

内部静态库中的所有符号都是隐藏的,因为它们不是公共API的一部分

问题是对第三方静态库隐藏符号的利弊是什么?是否有任何最佳实践和已知的陷阱?一方面,它们不是我的库的公共API的一部分。另一方面,它们是第三方库的公共API的一部分


我想当用户想要链接到同一第三方库的另一个版本时,就会出现问题。从理论上讲,隐藏其符号可能会解决这些问题,但实际上它可能会导致一些新的意外问题。

在我看来,您应该隐藏所有不属于API的符号。似乎还需要一个选项
——exclude libs,ALL
,将第三方静态库符号转换为隐藏符号。我不知道这个解决方案有什么缺点,它加快了动态链接器的速度,也没有发现与另一个库版本进一步静态链接的任何缺点。。因为它的静态链接不是动态链接(热交换等)