gpt4 book ai didi

c++ - 链接和名称修改是如何工作的?

转载 作者:行者123 更新时间:2023-11-28 03:48:32 24 4
gpt4 key购买 nike

让我们看看这段代码示例

//header
struct A { };
struct B { };
struct C { };
extern C c;

//code
A myfunc(B&b){ A a; return a; }
void myfunc(B&b, C&c){}
C c;

让我们从代码部分开始逐行执行此操作。当编译器看到第一个 myfunc 方法时,它不关心 A 或 B,因为它的使用是内部的。每个 C++ 文件都知道它接收什么,返回什么。尽管两个重载中的每一个都需要一个名称,但是如何选择名称以及链接器如何知道这意味着什么?接下来是C c;我曾经有一个错误是链接器不会重新调整,因此允许我访问其他 C++ 文件中的 C。这是因为 cpp 不知道 c 是 extern,所以我必须在标题中将其标记为 extern,然后才能成功链接。现在我不确定类类型是否与链接器和变量 C 有任何关系。我不知道 RTTI 将如何参与,但我知道 C 需要对其他文件可见。

链接器如何工作以及名称修改等。

最佳答案

我们首先需要了解编译结束和链接开始的位置。编译涉及采用编译单元(C 或 C++ 源文件)并将其转换为目标文件。简单地说,这涉及为每个函数生成机器代码片段以及为所有函数和静态(全局)变量生成符号表。占位符用于编译单元所需的在所述编译单元外部的任何符号。

然后链接器负责加载所有目标文件并使用真实地址(或机器无关代码的偏移量)解析所有占位符符号。这被放置在不同的部分中,操作系统的动态加载程序在加载可执行文件时可以读取这些部分。

因此对于细节。为了避免在链接过程中出错,编译器要求您声明所有将被当前编译单元使用的外部符号。对于全局变量,必须使用 extern 关键字,对于函数,这是可选的。

编译单元中定义的所有函数和全局变量都具有外部链接(即,可以被其他编译单元引用),除非使用 static 关键字(或 C++ 中的未命名命名空间)进行声明.在 C++ 中,vtable 也会有链接所需的符号。

现在在 C++ 中,由于函数可以重载,参数也构成了函数名的一部分。由于机器代码只是地址和寄存器,因此需要将额外信息添加到符号表中的函数名称中。这种额外的参数信息以损坏的名称形式出现,并确保链接器链接到重载函数的正确版本。

如果您真的对血淋淋的细节感兴趣,请查看 ELF file format (PDF)在 Linux 上广泛使用。 Windows 具有不同的格式,但可以预期其原理是相同的。可以找到 Itanuim(和 ARM)平台上的名称重整 here .

关于c++ - 链接和名称修改是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com