1、链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行,链接可执行与编译时、加载时、运行时
2、为了构造可执行文件,链接器必须完成两个主要任务:
(1)符号解析:符号解析的目的是将每个符号引用正好和一个符号定义关联起来
(2)重定位
3、目标文件文件有三种形式:
(1)可重定位目标文件:编译器和汇编器生成
(2)可执行目标文件:链接器生成
(3)共享目标文件
4、ELF头以一个16字节的序列开始,这个序列描述了生成该文件的字的大小和字节顺序。ELF header剩下的部分帮助链接器语法分析和解释目标文件的信息。
5、一个典型的ELF可重定位目标文件包含以下几个字节:ELF(Executable and Linkable Format)
(1).text:已编译程序的机器代码
(2).rodata:只读数据
(3).data:已初始化的全局和静态c变量
(4).bss:未初始化的全局和静态c变量
(5).symtab:一个符号表,它存放在程序中定义和引用函数和全局变量的信息。
6、每个可重定位目标模块m都有一个符号表,它包含m定义和引用的符号的信息。在链接器的上下文中,有三种不同的符号:
(1)由模块m定义并能被其他模块引用的全局符号
(2)由其他模块定义并被m引用的全局符号
(3)只被模块m定义和引用的局部符号
7、符号表是由汇编器构造的
8、链接器解析符号引用的方法是将每个引用与他输入的可重定位目标文件的符号表中的一个确定的符号定义关联起来。编译器只允许每个模块中的局部符号有一个定义。
9、链接器的输入是一组可重定位目标模块。
10、根据强弱符号的定义,Linux链接器使用以下规则来处理多重定义的符号名:
(1)不允许有多个同名的强符号
(2)如何一个强符号与多个弱符号同名,则选择强符号
(3)如果多个弱符号同名,则任选
其中:函数和已初始化的全局变量是强符号
11、编译系统将所有相关的目标模块打包成成一个单独的文件,称为静态库,它可以用作链接器的输入。相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件。
12、p477
深入理解计算机系统第七章-链接(一)
最新推荐文章于 2021-12-23 15:42:36 发布