今天同事做了《Windows核心编程》的读书报告,其中有一个建议如下:
假设有3个模块,一个user.exe,另外两个是A.dll,B.dll。
在编译链接各个模块时,我利用VS默认的base address,这样user.exe的默认基地址是0x00400000h,A或B的基地址是0x10000000h。这样,当加载器加载User.exe(它同时隐式链接A,B)。这样,A,B就会有一个被迫改变默认的基地址;从而导致映像文件里的机器代码指令(包含的硬编码地址)与加载后的不一样,从而需要调整(效率就会降低)。
我知道在vs中编译链接的时候可以利用 set baseaddress 修改。但是,假设我的可执行模块需要更多的dll时,我就希望利用工具(rebase)来修改。M i c r o s o f t在销售Wi n d o w s操作系统之前,在操作系统提供的所有文件上运行了R e b a s e程序,因此,如果将它们映射到单个地址空间中,所有的操作系统模块都不会重叠。
这里我们采用Rebase来进行基地址重定位
Rebase.exe -b 0x400000 myjiapp.exe A.dll B.dll
我们可以使用dumpbin来进行查看,
dumpbin /headers A.dll
我们在如下位置可以看到新的基地址,
optional header values
..........
10000000 imge base <10000000 to 1047cfff> (这个是没有进行重定位的)
007E 0000 imge base <007E 0000 to 1047cfff> (这个是没有进行重定位的)