📜  连结器

📅  最后修改于: 2021-06-28 07:05:37             🧑  作者: Mango

先决条件–编译器设计简介
链接器是系统中的一个程序,有助于将程序的目标模块链接到单个目标文件中。它执行链接过程。链接器也称为链接编辑器。链接是将一段代码和数据收集并维护到一个文件中的过程。链接器还将特定模块链接到系统库中。它以来自汇编器的对象模块作为输入,并形成一个可执行文件作为加载器的输出。

当源代码翻译成机器代码时,在编译时都执行链接;在加载程序将程序加载到内存时,则在加载时执行链接。链接是在编译程序的最后一步执行的。

链接有两种类型:
1.静态链接–
它是在源程序编译期间执行的。链接是在静态链接中执行之前执行的。它收集可重定位目标文件和命令行参数的集合,并生成可以加载和运行的完全链接的目标文件。

静态链接器执行两项主要任务:

  • 符号解析–将每个符号引用与一个符号定义完全关联。每个符号都有预定义的任务。
  • 重定位–重定位代码和数据段,并将符号引用修改为重定位的内存位置。

链接器将程序中使用的所有库例程复制到可执行映像中。结果,它需要更多的存储空间。因为它在运行时不需要系统上存在库。因此,它更快,更便携。没有失败的机会,并且更少的错误机会。

2.动态链接–动态链接在运行期间执行。通过将可共享库的名称放在可执行映像中来完成此链接。有更多的机会出错和失败的机会。它需要较少的内存空间,因为多个程序可以共享库的单个副本。

在这里,我们可以执行代码共享。这意味着我们在程序中多次使用同一个对象。每个模块与具有相同对象的其他模块共享一个对象的信息,而不是一次又一次地将相同的对象链接到库中。链接所需的共享库存储在虚拟内存中,以节省RAM。在此链接中,我们还可以重新定位代码以使代码平稳运行,但并非所有代码都可重定位,它可以在运行时固定地址。