不清楚链接器的工作

2024-04-19

我在windows上使用C语言。这个问题以前是程序中的标识符会发生什么情况? https://stackoverflow.com/questions/1986549/what-happens-to-identifiers-in-a-program。我把它打破了以减少数量。的问题。这是一个独立的查询(不依赖于上一个问题)

如果没有任何东西可以链接(即我没有使用任何库。我知道它没有任何用处。)链接器会更改汇编器的目标代码输出吗?如果是这样,它会改变什么?

听说LINKER还做了一些内存映射的操作。我不明白怎么办。该程序尚未运行,仅处于制造阶段。链接器如何映射到内存?它会是什么样子? LINKER的功能有哪些?

当人们提到“搬迁”、“地址绑定”时。我实在不明白他们的意思。它是什么以及它的目的是什么?

一些调试器显示如下信息: 调用堆栈: 0xffef32 、 0xf3234fe 等。它在运行时,对吗?或者是链接器所谓的“内存映射”的内存地址?

当人们提到类似的东西时symbols or symbol table。它们是指标识符(变量名、常量名、函数名)吗?

我在互联网上搜索信息但找不到任何有用的信息。可能我不确定要搜索什么。我不想读这方面的大书。但如果有任何文章、教程可以明确概念。这也会有帮助。

我是一名新手程序员。因此,如果您能用简单但技术性的术语进行解释,那就太好了。


当您编译源文件时,它通常被编译器/汇编器分成几个部分。作为一个假设的示例,假设使用以下部分:

  • .text - 包含所有可执行代码
  • .const - 包含常量数据
  • .data - 包含读/写初始化数据
  • .bss - 包含读/写未初始化的数据

在单个源文件中,编译器/汇编器将适当的内容分配给适当的部分,并给出该部分中使用的符号从零开始的偏移量。

例如:

int i;
const j = 3;
int k = 4;
int l;
int main()
{
return 1;
}

这可能会产生以下符号表:

Symbol Section Offset
i      .bss    0
j      .const  0
k      .data   0
l      .bss    4
main   .text   0

在目标文件中,除了符号表之外,还可以保存各段的数据。在此示例中,.text 部分将包含“return 1”的目标代码,const 部分将包含 3,data 部分将包含 4。.bss 部分不需要位于目标文件中,因为变量尚未初始化。

链接器可能做的第一件事是连接输入目标文件的所有部分并相应地调整符号偏移量。

现在我们来谈谈所谓的“重定位”或“地址绑定”。假设在假设的系统中,可执行代码从地址 0x1000 开始。我们还假设程序的数据部分希望在可执行代码之后的偶数页边界处开始。链接器将分配 0x1000 作为连接的 .text 部分的基础并调整所有符号。然后以类似的方式将 .const、.data 和 .bss 节的基部放置在内存中的适当位置。

有时,某个部分中会有符号引用。链接器必须更新这些引用以反映所引用符号的最终位置。目标文件可能包含“重定位记录”,如下所示

section offset symbol
.text   0x1234 foo

链接器将转到每个部分中的每个偏移量并更新那里的值以反映最终的符号值。

完成所有这些后,生成的“绝对”目标文件可以加载到内存中(当然是在正确的位置!)并执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不清楚链接器的工作 的相关文章

随机推荐