为什么当exe中的每个元素都离图像底部相对偏移时,为什么需要重定位表?我的意思是,即使图像偏移了0X60000的正偏移量,为什么还有重定位表,因为无论如何我们都会使用相对于新基准的RVA?
关键是代码无法通过RVA或历史记录访问全局变量(全局变量和函数地址)。通过其absolute地址访问它们。如果未将可执行文件加载到其首选地址,则应更改此地址。
重定位表正是由这些位置组成。这是一张所有表的表,应根据实际基址与首选地址的差额来调整。
BTW,EXE,与通常do n't的DLL相反,它包含重定位表。这是因为它们是要映射到地址空间的第一个模块,因此它们可能始终会加载到其首选地址。 DLL的情况有所不同,DLL通常确实包含重定位表。
P.S。在Windows 7中,EXE可能包含重定位表,以防它们倾向于在随机地址处加载。这是一项安全功能(可怜的恕我直言)
编辑:
应该提到的是,函数地址并不总是通过其绝对值来访问。在x86上,分支指令(例如jmp
,call
等)具有“短”格式,可用于相对偏移量。在重新定位表中无需提及这些地方。
对于EXE文件,不需要重定位表,因为可执行映像始终加载在其首选地址。重定位表可以安全地剥离。
抱歉,有些困惑。我以为只有“ com”文件总是加载在它们的首选位置。