dll的建议装载地址在编译的时候就已经确定了,多个dll加载时建议装入地址会冲突,windows的装载器会根据pe文件的重定位表将需要修正的地址进行修正。
修正时需要三个值 1.实际的装载地址(windows自己知道了windows装载器加载的当然知道了^_^)2.建议的装载地址编译器已经确定了(编译器知道并写在了pe文件的头部)
3.哪些需要修正了(写在pe文件头了)
重定位表中实际上保存了大量的需要进行修正的代码地址(不同的dll对应不同的地址)。windows装载器通过分析pe文件头对代码进行修正
比如某个调用 messagebox() 地址是004010cc(不一定啊举个例子) 但是有个dll的调用函数也是用了这个线性地址(就是说这个dll与之前的dll的线性地址有冲突啦^_^),当然是不可以的,所以装载器就通过pe文件的重定位表找到这段代码,以及对应的dll信息(这个函数对应的dll)将这个dll装载到别的不冲突的线性地址去,然后修正所有的使用了这个dll的导出函数的代码。修正值= 实际装载地址—建议装在地址 ptr dword[xxxxxx+修正值]
罗云斌的书中又讲到很详细