gcc在编译时或链接时的可见性

gojuced7  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(169)

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

xoefb8l8

xoefb8l81#

编译时,因为可视性被放置在对象(.o)文件中,然后由链接器在创建完整的可执行/共享对象时使用。当在链接时而不是编译时使用它时,它将没有任何效果,因为在对象文件中的可视性仍然是default。我发现在链接时也完全没有必要使用它。
在 * 如何 * 存储可见性的情况下,不同的符号可能位于不同的段中,并且它们从段的选项中获得其可见性。

相关问题