一、链接步骤
链接步骤1“符号解析”: 将符号引用和符号定义建立关联后;
链接步骤2“重定位”: 将引用符号的地址“重定位”为相关联的符号定义的地址。
二、原文链接:https://www.jianshu.com/p/7d13ec4735ba
符号解析完成后,就可进行重定位了。
2.1 前面的链接概述的文章提到过,符号的重定位分为以下三步:
1.合并相同的节
将集合E的所有目标模块中相同的节合并成新节。例如,所有 .text节合并作为可执行文件的 .text节
2.对符号定义进行重定位(确定地址)
确定新节中所有的符号定义在虚拟地址空间中的地址。例如,为函数确定首地址,进而确定每条指令的地址,为变量确定首地址
3.对符号引用进行重定位(填入地址)
修改.text节和.data节中对每个符号的引用(地址)
需要用到 .rel.text 和 .rel.data节中保存的重定位信息
2.2 这里有必要对重定位信息进行说明,如图:
2.3 下面是一个符号重定位的示例,如图:
① 首先进行符号解析
符号解析的结果是:
E中有main.o和swap.o两个模块,D中有所有定义的符号。
在main.o和swap.o的重定位条目中有重定位信息,反映符号引用的位置、绑定的符号名、重定位类型。
② 合并相同的节
③ 具体看一看main.o和swap.o的符号重定位的过程:
main.o 重定位前:
main.o 中的符号表:
2.4 通过这个例子,介绍一下R_386_PC32和R_386_32的重定位方式,如下图:
1. R_386_PC32
2. R_386_32
swap.o的重定位
原文链接:https://www.jianshu.com/p/7d13ec4735ba