链接及链接器

【前言】大多数编译系统或者讲大多数程序需要经历预处理(器)、编译(器)、汇编(器)和链接(器)四个阶段。预处理会进行头文件的替换,编译器会将源文件汇编成汇编语言,汇编器将汇编语言翻译成二进制的机器指令(被打包成一种二进制文件--可重定向的目标文件),链接器将已经经过以上三个步骤处理好的多个文件合并在一起。然后就得到一个可执行目标文件。着重讲一下链接器。

一、链接器的作用

  链接器帮助实现---分离编译。多个.c文件各自生成.o文件,最后合并在一起,如此我们在改变某个.c时仅需要编译这部分文件就可以了,然后链接。若是头文件里的有#include标准库头文件,还会引入生成好的标准库.o函数,例如printf.o文件(头文件里面仅仅是声明,没有实现)--此时是静态库。(静态链接库和动态链接库,动态库把对一些库函数的链接载入推迟到程序运行的时期)

      链接器由两个输入一组可重定向目标文件和命令行参数(-o),输出一个完全链接的、可以加载和运行的可执行目标文件

二、目标文件的本质

       在编译器前后我们看到了可重定向目标文件和可执行目标文件。这两个目标文件,还有动态链接库的共享目标文件这三个目标文件都是二进制代码和数据,纯粹的字节快的组合。目标文件是按照特定的目标文件格式组织的,各个系统各不相同。贝尔实验室第一个unix系统是a.out格式;现代x86-64linux的ELF格式。基本概念类似,以elf举例

  (1)ELF文件头 (2)程序头表(可选) (3)第1节,第2节,...,第n节,... (4)节头表 

二、链接器的两个任务

  符号解析和重定位

  1、符号解析

  将重定向目标函数定义和引用的符号与一个符号的定义关联起来。每个符号对应一个函数、一个全局变量或者一个静态变量。对于全局和局部符号的对应,有强符号和弱符号之分,优先选择强符号,就是我们讲的作用域范围;对于静态库的符号对应,链接器只复制被程序引用的目标模块段

猜你喜欢

转载自www.cnblogs.com/huangfuyuan/p/9174984.html