我试图使用gcc的fvisibility功能限制共享库的ABI。但是我很困惑,这是正确的方法。
我的makefile分两个阶段组织构建过程。在第一步,使用一些gcc选项将所有.cpp文件构建到目标文件。然后使用另一组gcc和ld选项将所有目标文件链接在一起。从我所看到的可见性与第二步相关。然而,这与我观察到的结果相矛盾。如果我在编译时选项中添加fvisibility = hidden,结果是预期的,nm -D报告的导出符号集要小得多。相反,如果我将它添加到链接时选项,它似乎不会影响构建。
在寻找解释时,我已经比较了使用和不使用fvisibility生成的目标文件。差异似乎在目标文件内的符号地址中。但是我不知道地址中的差异如何将消息传递给链接器,以便它能够隐藏其中一个案例中的符号并将它们暴露在另一个案例中。
有人可以向我解释一下。谢谢你的时间。