将静态库链接到共享库时,我应该隐藏符号吗?

时间:2017-09-23 11:40:59

标签: linux gcc linker static-linking dynamic-linking

当您编写共享库时,通常建议隐藏所有内部符号以减少动态链接时间,通常使用链接描述文件或-fvisibility选项。

就我而言,共享库与两种类型的其他库链接:

  • 内部静态库
  • 第三方静态库(例如,libuv)

所有这些都使用-Wl,--whole-archive选项链接到共享库中,因此生成的共享库是自给自足的,只链接到stdlib。

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

问题是将符号隐藏在第三方静态库中的优缺点是什么?有没有最好的做法和已知的陷阱?一方面,他们不是我图书馆公共API的一部分。另一方面,它们是第三方库的公共API的一部分。

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

1 个答案:

答案 0 :(得分:1)

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