程序在编译之后,许多的地址已经写死了,编译时生成的地址 = ImageBase + RVA 。如果后期程序在使用的过程中,ImageBase的值改变,那么原来编译时写死的地址将无法加载。重定位表就是来解决这个问题的
当程序的ImageBase发生改变之后,为了使程序能够继续正常运行,就需要重定位表。重定位表记录的需要修正的地址。重定位表位于数据目录项的第六个结构
通过第一个块的VirtualAddress(地址)加上SizeOfBlock(大小)就可以得到下一个的位置了,以此类推直到VirtualAddress和SizeOfBlock为零,则代表结束。具体项的宽度是16字节 高四位 代表类型:值为3 代表的是需要修改的数据 值为0代表的是 用于数据对齐的数据,可以不用修改.也就是说 我们只关注 高4位的值为3的就可以了.。每一个块中需要修复的数据为,每个低十二位的值加上VirtualAddress。具体项的数量 = (SizeOfBlock – 8)/2 (每一项占两个字节,故除二);