1、可执行程序产生流程
2、链接器
链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程。这个文件可以被加载到存储器并执行。
链接可执行与编译时,也可执行与加载时,甚至执行与运行时。
链接器的主要工作就是:
(1)符号解析。目标文件定义和引用的符号,将每个符号引用刚好和一个符号定义联系起来。
(2)重定位。编译器和汇编器生成从地址0开始的代码和数据节。链接器将每个符号定义与一个存储器位置联系起来,
然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。
链接器可分两类:
(1)静态链接
由静态链接器完成,以一组可重定位目标文件(通常静态库)和命令行参数作为输入,生成一个完全链接的可以加载和运行
的可执行目标文件作为输出。静态库,编译器提供的一种机制,将相关的目标模块打包成为一个单独的文件,
这个文件就是静态库,用作链接器的输入,链接器只拷贝静态库里被应用程序引用的目标模块。
其他的处理方式,例如:
A,编译器辨认对标准函数的调用,直接生成相应的代码。显著增加编译器的复杂度,添加、删除或修改标准函数时,
都需要一个新编译器版本。
B,所有标准C函数都放在一个单独的可重定位目标模块中,把这个模块链接到可以执行文件中。
主要缺点是完全拷贝标准函数集合,对任何标准函数的修改,都需要重新编译整个源文件。
注意:各个库的成员相互独立,可以按照任何顺序放置在命令行结尾处。
如果不相互独立,那么必须排序。
(2)动态链接
静态库解决了如何让大量相关函数对应用程序可用的问题,然后静态库需要定期维护和更新。另外在运行时,
应用程序需要复制库中的代码到运行进程中,浪费存储系统资源。
共享库是解决静态库缺陷的一个创新产物。
共享库也称共享目标,在Unix系统中,通常用.so后缀,在Windows系统中,称为DLL。
共享库是一个目标模块,在运行时,可以加载到任意的存储器地址并和一个在存储器中的程序链接起来。
这个过程就是动态链接,由动态链接器完成。
所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库那也拷贝和嵌入到引用它们的可执行文件中。
参考书目:编译原理(龙书)
深入理解计算机系统(强烈推荐)
------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。