第七章 链接
姓名:王玮怡 学号:20135116
一、关于链接
1、含义
链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。链接是由链接器程序自动执行的。
2、执行时间
二、编译器驱动程序
驱动编译器:代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
三、静态链接
1、静态链接器
Unix的静态链接器(static linker)ld,以一组可重位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在另一个节中,而未初始化的变量又在另外一个节中。
2、链接器的两个任务
四、目标文件
目标文件的三种形式
五、可重定位目标文件
.strtab:一个字符串表,其内容包括:.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。
六、符号和符号表
1、链接器的上下文中,有三种不同的符号:
2、符号表
七、符号解析
1、链接器如何解析多重定义的全局符号
(1)强符号:函数和已初始化的全局变量
(2)弱符号:未初始化的全局变量
(3)处理规则:
2、与静态库链接
所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库,可以用做链接器的输入。其中,在Linux下是存档文件,Windows下是lib。
在符号解析的阶段,链接器从左到右按照它们在编译器驱动程序命令行上出现的相同顺序来扫描可重定位目标文件和存档文件。(驱动程序自动将命令行中所有的.c文件翻译成.o文件),在这次扫描中,链接器维持一个可重定位目标文件的集合E(这个集合中的文件会被合并起来形成可执行文件),一个未解析的符号(即引用了但是尚未定义的符号)集合U,以及一个在前面输入文件中已定义的符号集D,初始时,E、U和D都是空的。
七、重定位
1、重定位的两个步骤
(1)重定位节和符号定义
(2)重定义节中的符号引用
2、重定位条目
(1)无论何时汇编器遇到对最终位置位置的目标引用,它就会生成一个重定位条目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用。
(2)代码的重定位条目放在.rel.text中。
(3)已初始化的数据的重定位条目放在.rel.data中。
(4)ELF定义了11种不同的重定位类型。两种最基本的重定位类型:
3、重定位符号引用
(1)相对引用
(2)绝对引用
八、可执行目标文件
九、加载可执行目标文件
加载器将可执行目标文件中的执行代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令或入口点来运行该程序。这个将程序拷贝到存储器并运行的过程叫做加载。
十、动态链接共享库
1、静态库的缺点:
2、共享库
十一、从应用程序中加载和链接共享库
-fPIC
选项指示GNU生成PIC代码
十三、处理目标文件的工具
十四、总结
链接可以在编译时由静态编译器来完成,也可以在加载时和运行时由动态链接器来完成。链接器处理成为目标文件的二进制文件,它有三种不同的形式:可重定位的、可执行的和共享的。可重定位的目标文件由静态链接器合并成为一个可执行的目标文件,它可以加载到存储器中并执行。共享目标文件(共享库)是在运行时由动态链接器链接和加载的,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用dlopen库的函数时。
原文:http://www.cnblogs.com/wwy-20135116/p/5356020.html