您的位置:首页 > 理论基础

深入理解计算机系统:链接

2011-12-02 10:33 169 查看
链接

1、静态链接:以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。主要完成符号解析和重定位。

1.1、符号解析:将每个符号引用刚好和一个符号定义联系起来。

主要是解析外部符号,在编译时,编译器向汇编器输出每个全局符号,或者是强或者是弱,函数和已经初始化的全局变量时强符号,未初始化的全局变量时弱符号,如果出现多重的全局符号,连接器会采取相应的策略,具体为:不允许出现多个强符号;有一个强多个弱,选强;多个弱,任意选择。

解析过程:在连接时,连接器维持一个可重定位目标文件集合、一个为解析符号集合和一个已定义符号集合,初始时全为空,然后依次解析命令行上的输入文件,将内容填入上述三个表,在对静态库进行解析时,连接器只拷贝被程序引用的目标模块,全部解析完之后,如果还有为解析的符号则报错。但是这种解析时有顺序的,定义一定要在引用之后,负责,定义在前,引用还是无法解析,最好报错。

1.2、重定位:把每个符号定义与一个存储器地址联系起来,修改所有对这些符号的引用。

在完成符号解析之后,进行重定位,包括两部:重定位节和符号定义(主要是将不同模块的相同节合并到一个节,重定位需要重定位的代码或数据),重定位节中的引用。

2、目标文件:可重定位目标文件、可执行目标文件、共享目标文件。

2.1、可重定位目标文件:比如.o,每个可重定位目标文件都有一个头部,记录该目标文件的信息,包括代码、只读数据、已初始化的全局变量、未初始化的全局变量、符号表(函数和全局变量,不包含对应于本地非静态程序变量的任何符号)、可重定位的代码、可重定位的已初始化数据、调试表、源文件行号与代码的映射表。

符号和符号表:自己定义被其他模块引用、外部符号和本地符号。

2.2、可执行文件:可执行文件是一个二进制文件,而且包括加载程序到存储器并运行它所需的所有信息。可执行文件的头部与重定向目标文件的头部类似,少了需要重定位的代码和数据,多了入口点。执行可执行文件时,加载器将该可执行文件拷贝到内存中,并分配一块进程区间,从上往下依次为用户栈(push地址降低)、共享库的存储器映射区域、堆(new地址增大)、读写段(数据段)、只读段(代码段),地址时有高到底的。

2.3、共享库:采用静态库,需要将库中的内容拷贝到新生成的可执行文件,增大可执行文件的大小,采用共享库只需将一些定位和符号信息拷贝到可执行文件,在实际运行时,动态调用符号定义,因此执行时必须指定共享库的位置。

3、处理目标文件的工具:

AR:创建静态库,插入、删除、列出和提取成员。

STRINGS:列出一个目标文件中所有可打印的字符串。

STRIP:从目标文件中删除符号表信息。

NM:列出一个目标文件中符号表定义的符号。

SIZE:列出目标文件中节的名字和大小。

READELF:能够显示一个目标文件的所有信息。

OBJDUMP:反汇编

LDD:列出一个可执行文件运行时需要的共享库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: