當連接器生成一個PE文件時,會假設這個文件在執行時被裝載到默認的基地址處(基地址+RVA就是VA)。並把code和data的相關地址寫入PE文件。若是像EXE同樣首先加載就是它imageBase沒問題能算出真正的VA,可是要有多個DLL文件,就會出現基址不對的問題,經過基址+RVA算出來的數據地址和函數地址就會出問題(連接器算的)須要重定位表來調整。在PE文件中重定位表每每單獨做爲一個節用「.reloc」表示。數組
#define IMAGE_DIRECTORY_ENTRY_BASERELOC //重定位表地址 重定位表位於.reloc節內經過_IMAGE_BASE_RELOCATION來組織 typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[1]; } IMAGE_BASE_RELOCATION;
重定位表只是讓本PE可以正確運行的東西。修正本PE的值。函數