gpt4 book ai didi

compiler-construction - 不清楚链接器的工作

转载 作者:行者123 更新时间:2023-12-04 08:40:18 25 4
gpt4 key购买 nike

我在 Windows 上使用 C 语言。这个问题以前是 What happens to identifiers in a program? 的一部分.我打破它以减少没有。的问题。这是一个独立的查询(不依赖于上一个问题)

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

听说LINKER也做一些内存映射的操作。我不明白怎么做。该程序没有运行,它只是在制造阶段。链接器如何映射到内存?它会是什么样子? LINKER 的全部功能是什么?

当人们提到“搬迁”时,“地址绑定(bind)”。我真的不明白他们的意思。它是什么以及它的目的是什么?

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

当人们提到像 symbols 这样的东西时或 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 部分不需要在目标文件中,因为变量尚未初始化。

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

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

    有时节中有符号引用。这些引用必须由链接器更新,以反射(reflect)所引用符号的最终位置。目标文件可能包含看起来像的“重定位记录”
    section offset symbol
    .text 0x1234 foo

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

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

    关于compiler-construction - 不清楚链接器的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986640/

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