为什么要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
实例: