我有一些库函数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上也应该至少具有合理的解决方案。