📜  链接器(1)

📅  最后修改于: 2023-12-03 15:28:33.835000             🧑  作者: Mango

链接器

什么是链接器?

链接器(Linker)是一个程序,负责将编译后的目标文件(Object File)链接成可执行文件或者库文件。链接器的主要任务是解决符号(Symbol)的引用问题,将所有的目标文件很好的组合在一起,并与操作系统和外部库文件建立适当的联系。

链接器的工作方式

链接器的主要工作可以分成以下几步:

  1. 预处理:解析目标代码中的宏定义、条件编译等预编译指令,并将它们转化成有效的目标代码。
  2. 符号解析:将目标代码中的所有符号(函数名、变量名等)与其定义进行匹配,并将未定义符号记录下来,准备后面的链接处理。
  3. 地址分配:将每个目标文件中的各个部分分配合适的地址,以便能够在内存中正确的执行,而不会互相冲突。
  4. 重定位:将所有未定义符号的引用,与目标文件所属段中的符号地址进行计算,从而得到正确的地址。
  5. 符号重定义检查:确保每个符号只被定义一次,而没有被多次定义。否则就会引起冲突错误。
  6. 目标文件及符号表的组装:将链接器处理完的目标代码以及重定位表、符号表等数据结构组装起来,生成一个可执行文件或库文件。
链接器的种类

在Linux系统中,有以下两种类型的链接器:

  1. 静态链接器:将所有目标文件中的代码和数据段复制到可执行文件中,由系统kernel在程序启动时将它们加载到内存中。
  2. 动态链接器:将可执行文件中使用到的库函数调用以及未定义符号引用与库文件中的函数名及符号地址进行匹配,最后动态的将库文件加载到内存中,程序运行时通过动态链接调用库函数。
链接器的使用

在Linux系统中,链接器通常由编译器自动调用。一般来说,编译器产生的目标文件中都包括了链接信息,以及库文件的引用等信息,所以编译器只需要调用链接器,将目标文件组装成一个可执行文件即可。

以下是使用GCC编译器进行静态链接的命令:

gcc -o output_file input_file1.o input_file2.o -static

以下是利用GCC编译器进行动态链接的命令:

gcc -o output_file input_file1.o input_file2.o -ldl
结语

链接器是程序员必须要掌握的重要工具之一,理解链接器的原理和使用方法,有助于我们写出高效、可靠的程序。