为什么要PE重定位:当链接器生成一个PE文件时,它假设这个文件执行时会被装载到默认的基地址处,并且把code和data的相关地址都写入PE文件 中。如果装入时按默认的值作为基地址装入,则不需要重定位。但如果可执行文件被装载到虚拟内存的另一个地址,链接器所登记 的那个地址就是错误的,这时就需要用重定位表来调整。在PE文件中,它往往单独分为一块,用”.reloc”表示。

EXE文件不存在重定位表:对于EXE文件来说,每个文件总是使用独立的虚拟地址空间,所以EXE总是能够按照这个地址装入,这意味着EXE 文件不再需要重定位信息

DLL文件需要重定位表:对于DLL文件来说,由于多个DLL文件全部使用宿主EXE文件的地址空间,不能保证装入地址没有被其他DLL使用, 所以DLL文件必须包含重定位表。

加载器如何重定位:加载器会比较基址和实际的装入地址,计算出一个差值,并加到重定位地址上。

重定位表的结构:

IMAGE_BASE_RELOCATION STRUC
VirtualAddress DWORD ?;重定位数据开始RVA地址
SizeOfBlock DWORD ?;重定位块的长度
TypeOffset WORD ?;重定位项数组
IMAGE_BASE_RELOCATION ENDS

实例:

获取PE重定位表信息-编程知识网

获取PE重定位表信息