美文网首页
2018-12-09 CSAPP 第七章 链接

2018-12-09 CSAPP 第七章 链接

作者: ShawnPanCn | 来源:发表于2018-12-09 22:16 被阅读0次

    链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。链接可以执行于编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是在程序被加载器加载到内存并执行时;甚至执行于运行时,也就是由应用程序来执行。

    7.1编译驱动程序

    预处理器(cpp)

    将程序从ASCII源文件翻译成 .i 文件

    编译器(ccl)

    翻译成 .s ASCII汇编语言文件

    汇编器(as)

    翻译成 .o 可重定位目标文件

    链接器(ld)

    7.2静态链接

    链接器主要任务

    符号解析

    将函数,全局变量,静态变量(static)的定义和引用(使用)关联起来

    重定位

    汇编器生成从地址0开始的代码和数据(产生相对地址),链接器将这些定义和内存位置关联起来(产生绝对地址)

    这里的绝对地址是对于这个程序内部而言的绝对位置,并不是整个PC内的绝对位置

    7.3 目标文件

    目标文件有三种形式:

    7.4可重定位目标文件格式(ELF)

    7.5 符号和符号表

    有三种不同的符号:

    局部变量是在运行时保存在栈中,链接器不知道其存在

    所以ELF文件的符号表中没有局部变量的条目

    而编译器的符号表中是有的

    全局符号分为强符号和弱符号

    强符号为函数或者已经初始化的全局变量

    弱符号是未初始化的全局变量

    遇到同名符号,有强符号就将引用解析为强符号,否则随机选取一个弱符号解析

    这样可能会引发错误

    尽量避免使用全局变量

    最好使用extern命令

    对于第一个,假如随机选取p1文件中的符号作为x引用的值得话,如果向p2中的x写入值,实际上是向p1中的x的地址写入值,而p2中的x类型比p1中的大两倍,所以写入操作会改变y的值

    对于第二个,因为p1中的x为强符号所以结果和第一个一样

    7.6.2 静态库

    将常用文件(如标准I/O,数学函数等)存为.a后缀的存档文件,当链接时,会且仅会将库中被调用的函数连接到程序中

    链接器从左到右扫描命令行出现的可重定位目标文件和存档文件

    在扫描中,链接器维护了一个引用了但是没有解析的符号集合U

    当输入文件尾.o文件时,添加函数或变量到U中

    当输入文件为.a文件时,匹配U中符号和存档文件中定义的符号,并将没有匹配的丢弃掉

    如果完成扫描后U非空,则报错

    如果一个库出现在目标文件前,链接就会失败

    所以一般将库放在最后

    如果库a和b会互相调用则其中一个库要输入两遍

    7.7 重定位

    重定位由两步组成:

    重定位节和符号定义。

    重定位节中的符号引用。

    7.7.1重定位条目

    代码的重定位条目在.rel.text中。已初始化数据的重定位条目放在.rel.data中。

    7.7.2重定位符号引用

    重定位PC相对引用

    重定位绝对引用

    相关文章

      网友评论

          本文标题:2018-12-09 CSAPP 第七章 链接

          本文链接:https://www.haomeiwen.com/subject/kuakhqtx.html