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