c++ - 链接器如何处理具有不同链接的变量?

标签 c++ c linker compiler-construction operating-system

在 C 和 C++ 中,我们可以操纵变量的链接。联动分为三种:不联动、内部联动、外部联动。我的问题可能与为什么将这些称为“链接”有关(与链接器有何关系)。

我知道链接器能够处理带有外部链接的变量,因为对该变量的引用不限于单个翻译单元,因此不限于单个目标文件。通常在操作系统类(class)中讨论其实际工作原理。

但是链接器如何处理变量 (1) 没有链接和 (2) 有内部链接?这两种情况有什么区别?

最佳答案

就 C++ 本身而言,这并不重要:唯一重要的是整个系统的行为。没有链接的变量不应链接;具有内部链接的变量不应跨翻译单元链接;具有外部链接的变量应该跨翻译单元链接。 (当然,作为编写 C++ 代码的人,您也必须遵守的所有约束。)

然而,在程序的编译器和链接器套件中,我们当然确实必须关心这一点。达到预期结果的方法取决于我们。一种传统方法非常简单:

  • 没有链接的标识符永远不会传递给链接器。

  • 具有内部链接的标识符也不会传递给链接器,或者传递给链接器但标记为“仅供在这个翻译单元中使用”。也就是说,它们没有 .global 声明,或者它们有 .local 声明,或类似的声明。

  • 带有外部链接的标识符被传递给链接器,如果链接器看到内部链接标识符,这些外部链接符号被不同地标记,例如,有一个 .global 声明或者没有 .local 声明。

如果您有类似 Linux 或 Unix 的系统,请对编译器生成的对象 (.o) 文件运行 nm。请注意,一些符号用大写字母注释,例如用于文本和数据的 TD:这些是全局的。其他符号用小写字母注释,如 td:这些是局部的。因此,这些系统正在使用“将内部链接传递给链接器,但将它们标记为与外部链接不同”的方法。

关于c++ - 链接器如何处理具有不同链接的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51737002/

相关文章:

c++ - 如何在数组中打印所需数量的元素?

c++ - 什么会导致返回函数崩溃? C++

c++ - 访问C++空字符串中的任意位置

c++ - 如何对 1 到 50000 之间的 10000 个数字进行排序

c - 替代终端的 Bison/Flex 打印值

windows - 如何找出哪个库包含 libcmt?

c++ - 在 Eclipse Mars 中链接 GLFW

c - G_DEFINE_TYPE 在 GTK 中是什么意思?

c - 访问结构变量双指针

memory-management - 进程虚拟地址空间和内核地址空间?如何?