一、链接步骤

链接步骤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的符号重定位的过程:

背景知识:下图展示了一个可执行目标文件中被重定位的 .text 和 .data 节。重定位节中各列表示什么?


main.o 重定位前

main.o 中的符号表

2.4 通过这个例子,介绍一下R_386_PC32R_386_32的重定位方式,如下图:

1. R_386_PC32

​​​​​​​        

2. R_386_32

       

        

        

swap.o的重定位




原文链接:https://www.jianshu.com/p/7d13ec4735ba

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐