为什么当exe中的每个元素都位于与镜像底部的相对偏移量时,还需要重定位表?我的意思是,即使镜像被0X60000的正偏移量打乱,为什么要有重定位表,因为我们无论如何都会使用相对于新基址的RVA?
发布于 2012-03-15 00:51:15
关键是代码不会通过RVA或whats- or -ever访问全局变量(全局变量和函数地址)。它们通过它们的绝对地址进行访问。并且在可执行文件未被加载到其优选地址的情况下,该地址应该被改变。
重定位表正是由这些位置组成的。这是一个表,其中列出了应该根据实际基址和首选基址的差异进行调整的所有位置。
,EXEs,与DLL相比,DLL通常不包含重定位表。这是因为它们是映射到地址空间的第一个模块,因此它们可能总是在它们的首选地址加载。DLL的情况则不同,它通常包含重定位表。
P.S.在Windows 7EXE中,可能包含重定位表,以防它们被加载到随机地址。这是一个安全特性(可怜的IMHO)
编辑:
值得一提的是,函数地址并不总是通过其绝对值来访问的。关于x86分支指令(如jmp
、call
等)使用相对偏移量的“短”格式。这样的地方不需要在移位表中提到。
发布于 2012-03-15 04:36:58
对于EXE文件,不需要重定位表,因为可执行映像始终在其首选地址加载。可以安全地剥离重定位表。
https://stackoverflow.com/questions/9706099
复制相似问题