符号解析与重定位是静态链接的核心内容。
重定位
重定位表
重定位表专门用来保存与重定位相关的信息,它在ELF文件中往往是一个或多个段。
- 对于可重定位的ELF文件来说,它必须包含有重定位表,用来描述如何修改相应地段里的内容。
- 对于每个要被重定位的ELF段都有一个对应的重定位表,而一个重定位表往往是ELF文件种的一个段,所以重定位表也被叫做重定位段。
用objdump -r XXX.o查看目标文件的重定位表
每个要被重定位的地方叫一个重定位入口。在这里,代码段的重定位入口有6个。
RELOCATION RECORDS FOR [.txt]代表这个重定位表示代码段的重定位表。
OFFSET:重定位入口的偏移,表示该入口在要被重定位的段中的位置。对于可重定位文件来说,这个值是该重定位入口所要修正的位置的第一个字节相对于段起始的偏移;对于可执行文件或共享对象文件来说,这个值是重定位入口索要修正的位置的第一个字节的虚拟地址。
符号解析
用readelf -s XXX.o查看XXX.o的符号表
UND:undefined未定义类型。这种未定义的符号是因为该目标文件中有关于它的重定位项。所以在链接器扫描完所有的输入目标文件之后,所有这些未定义的符号都应该能够在全局符号表中找到,否则链接器就报符号未定义错误。
指令修正方式
寻址方式的区别:
- 近址寻址或远址寻址
- 绝对寻址或相对寻址
- 寻址长度为8位、16位、32位或62位
对于32位x86平台下的ELF文件的重定位入口所修正的指令寻址方式只有两种(这两种指令修正方式每个被修正的位置的长度都是32位,即4个字节):
- 绝对近址32位寻址
- 相对近址32位寻址
修正地址
S:符号的实际位置
P:被修正的位置(相对于段开始的偏移量或者虚拟地址)
A:保存在被修正位置的值
- 绝对寻址修正:S+A
- 相对地址寻址:S+A-P
其他记叙
看到这一部分真的有点懵了。。。明天开始大概看一下汇编的基础知识吧。。。各种指令有点晕_(¦3」∠)_