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

标签 c++ gcc linker

我正在尝试使用 gcc 的 fvisibility 功能限制共享库的 ABI。但是我很困惑什么是正确的方法。

我的 makefile 将构建过程分为两个阶段。在第一步中,所有 .cpp 文件都使用一些 gcc 选项构建为目标文件。然后使用另一组 gcc 和 ld 选项将所有目标文件链接在一起。从我读到的内容来看,可见性与第二步有关。然而,这与我观察到的结果相矛盾。如果我将 fvisibility=hidden 添加到编译时选项,结果如预期的那样,nm -D 报告了一组更小的导出符号。相反,如果我将它添加到链接时间选项中,它似乎不会影响构建。

在寻找解释时,我比较了使用和不使用 fvisibility 生成的目标文件。区别似乎在于目标文件中符号的地址。但是我不知道地址的差异如何将消息传递给链接器,以便它能够在一种情况下隐藏符号并在另一种情况下暴露它们。

谁能给我解释一下。感谢您的宝贵时间。

最佳答案

编译时,因为可见性放在对象 (.o) 文件中,然后在创建完整的可执行文件/共享对象时由链接器使用。在链接时而不是编译时使用它时,它将没有任何效果,因为目标文件中的可见性仍然是默认。我发现根本不需要在链接时使用它。

如何存储可见性的情况下,不同的符号可能位于不同的段中,并且它们从段的选项中获取它们的可见性。

关于c++ - gcc 在编译时或链接时的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180946/

相关文章:

GCC 4.5 vs 4.4与依赖项的链接

linux - linux下gcc使用静态库的方法

c++ - 链接器错误 - undefined reference

c++ - 算术表达式上下文中的宏扩展?

c++ - OpenGL SOIL 未定义对 glBindTexture、glTexImage2d 等的引用

c++ - C++ 中正弦、余弦和平方根的最快实现(不需要非常准确)

c++在命名空间中共享变量时出现重复符号链接(symbolic link)器错误

C++ - 比较两张 .jpeg/.png 图片并将不同的像素打印到矩阵中

c - 在不同级别使用不同的枚举类型

c++ - LNK2005 和 LNK1169 错误 - C++