链接器简介

http://www.cnblogs.com/clearlylin/p/4656671.html

1、可执行程序产生流程

 

2、链接器

链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程。这个文件可以被加载到存储器并执行。

链接可执行与编译时,也可执行与加载时,甚至执行与运行时。

链接器的主要工作就是:

(1)符号解析。目标文件定义和引用的符号,将每个符号引用刚好和一个符号定义联系起来。

(2)重定位。编译器和汇编器生成从地址0开始的代码和数据节。链接器将每个符号定义与一个存储器位置联系起来,

然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。

链接器可分两类:

(1)静态链接

由静态链接器完成,以一组可重定位目标文件(通常静态库)和命令行参数作为输入,生成一个完全链接的可以加载和运行

的可执行目标文件作为输出。静态库,编译器提供的一种机制,将相关的目标模块打包成为一个单独的文件,

这个文件就是静态库,用作链接器的输入,链接器只拷贝静态库里被应用程序引用的目标模块。

其他的处理方式,例如:

A,编译器辨认对标准函数的调用,直接生成相应的代码。显著增加编译器的复杂度,添加、删除或修改标准函数时,

都需要一个新编译器版本。

B,所有标准C函数都放在一个单独的可重定位目标模块中,把这个模块链接到可以执行文件中。

主要缺点是完全拷贝标准函数集合,对任何标准函数的修改,都需要重新编译整个源文件。

注意:各个库的成员相互独立,可以按照任何顺序放置在命令行结尾处。

   如果不相互独立,那么必须排序。

(2)动态链接

静态库解决了如何让大量相关函数对应用程序可用的问题,然后静态库需要定期维护和更新。另外在运行时,

应用程序需要复制库中的代码到运行进程中,浪费存储系统资源。

共享库是解决静态库缺陷的一个创新产物。

共享库也称共享目标,在Unix系统中,通常用.so后缀,在Windows系统中,称为DLL。

共享库是一个目标模块,在运行时,可以加载到任意的存储器地址并和一个在存储器中的程序链接起来。

这个过程就是动态链接,由动态链接器完成。

所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库那也拷贝和嵌入到引用它们的可执行文件中。

参考书目:编译原理(龙书)

      深入理解计算机系统(强烈推荐)

原文地址:https://www.cnblogs.com/feng9exe/p/6876376.html