链接:就是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个可执行文件可以被加载到存储器内执行。
链接可以执行在编译时,加载时,也可以在程序被加载器加载到存储器执行时,运行时候也可以由应用程序执行。
1.目标文件:
1.可重定位目标文件:
包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可以执行目标文件。
典型的是ELF可重定位目标文件,ELF头以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序(大小端法),ELF头剩下的部分包含帮助链接器语法分析和解释目标文件信息,包括ELF头的大小,目标文件的类型(可重定位,可执行,或者共享的),机器类型,节头部表的文件偏移。以及节头部表的的文件偏移。头部表的条目大小和数量。不同节的位置和大小是节头部表描述,其中目标文件中每个节都有一个固定大小的条目。夹在ELF头和节头部表之间的都是节。
2.可执行目标文件
直接可以运行的。
3.共享目标文件:
可以在加载或者运行时被动态的加载到存储器并链接。
2.传统静态链接。
由一组可重定位的目文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输出的可重定位目标文件由目标文件各种不同的代码和数据节(section)构成。为了构成可执行文件,链接器完成两个主要任务:
1.符号解析:
目标文件定义和引用符号,符号解析的目的是将每个符号引用更好和一个符号定义联系起来。
2.重定位:
编译器和汇编器生成从地址0开始的代码和数据节。链接器通过通过将每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这
个存存储器位置,从未重定位这些节。
目标文件是字节块的集合,有些包含程序代码,有些则包含程序数据,而其他的则包含指导链接器和加载器的数据结构。链接器将这些块连接起来,确定被连接块运行时位置
并且修改代码的数据块中的各种位置,链接器对目标机器了解甚少。
3.加载时的共享库的动态链接。
4.运行时候的共享库链接。
应用程序在运行时要求动态链接器加载和链接任意 共享库,而无需在编译时链接到那些库的应用里面。可以用来分发软件,构建高性能的web服务器。