先决条件——编译器设计介绍
链接器是系统中的一个程序,它有助于将程序的目标模块链接到单个目标文件中。它执行链接过程。链接器也称为链接编辑器。链接是将一段代码和数据收集和维护到一个文件中的过程。链接器还将特定模块链接到系统库中。它从汇编器中获取目标模块作为输入,并形成一个可执行文件作为加载器的输出。
链接在编译时执行,当源代码被翻译成机器代码时,在加载时,当程序被加载器加载到内存中时。链接是在编译程序的最后一步执行的。
Source code -> compiler -> Assembler -> Object code -> Linker -> Executable file -> Loader
链接有两种类型:
1. 静态链接——
它在源程序编译期间执行。链接在静态链接中执行之前执行。它收集可重定位的目标文件和命令行参数,并生成可以加载和运行的完全链接的目标文件。
静态链接器执行两项主要任务:
- 符号解析——它将每个符号引用与一个符号定义相关联。每个符号都有预定义的任务。
- 重定位——它重定位代码和数据部分,并修改对重定位的内存位置的符号引用。
链接器将程序中使用的所有库例程复制到可执行映像中。因此,它需要更多的内存空间。因为它在运行时不需要系统上存在库。所以,它更快,更便携。没有失败机会和更少的错误机会。
2. 动态链接——在运行时执行动态链接。这种链接是通过在可执行映像中放置可共享库的名称来完成的。出错和失败的机会更多。它需要更少的内存空间,因为多个程序可以共享库的单个副本。
在这里我们可以进行代码共享。这意味着我们在程序中多次使用同一个对象。每个模块与具有相同对象的其他模块共享一个对象的信息,而不是一次又一次地将相同的对象链接到库中。链接所需的共享库存储在虚拟内存中以节省RAM。在这个链接中我们也可以重定位代码以保证代码的顺利运行,但是所有的代码都是不可重定位的。它在运行时修复了地址。