将默认符号可见性从静态提升为共享库

时间:2019-01-20 06:25:55

标签: c++ c gcc

我有一些库函数foo(),可以静态或动态链接到主程序。该功能在静态库中实现,然后链接到共享库中,应用程序可以在两者之间进行选择。像往常一样,在Windows上,解决方案很容易:将foo添加到def文件中的已导出符号列表中,并且一切正常。和往常一样,Linux并没有使我的生活更轻松,而是希望我玩一个称为“符号可见性挑战”的游戏。

SO上有similar question,但是区别是我需要保持相同的接口foo()。此外,对我来说,强制使用-Wl,--whole-archive强制包含所有符号都是胡说八道。链接器不应该足够聪明以找到只能从导出的符号访问的所有符号吗?

所以到目前为止我一直在尝试:

  • foo()标记为__attribute__((visibility("default")))并链接到共享库-生成空的共享库
    • -Wl,--whole-archive链接时的效果相同
    • 尝试重新声明foo()时具有相同的效果
  • foo()标记为__attribute__((visibility("hidden"))),并尝试在共享库中重新定义foo-链接器错误,重复的sybmol
  • 在共享库中定义另一个默认可见性函数,该函数调用foo()。至少使静态库中的符号包含在共享中,但是foo()不可见。

所以我真正需要做的是将foo()的默认可见性从静态扩展为链接到的共享库。

在其他地方建议使用其他选项,例如将所有源文件都包含到两个库中,或者使用ar从静态lib中提取所有目标文件并将其重新打包为共享,但是我想避免这些攻击。我想相信,在Windows上具有如此微不足道的解决方案的问题在Linux上也应该至少具有合理的解决方案。

0 个答案:

没有答案