在创建最终图像之前,链接器在解析目标文件中的重定位时会采取哪些步骤?更具体地说,链接器如何处理已经存储在重定位站点的值?它总是将它添加到最终的VA / RVA中,还是有时会被忽略(例如某些重定位类型)?
我在MS PE/COFF Specfication找不到明确的解释,经过谷歌搜索和实验一段时间后,我能找到的就是:
您能否指出哪些(相关的)文档解释了链接器如何处理重定位?
答案 0 :(得分:5)
“图像文件”中使用的重定位部分与“目标文件”中的重定位信息略有不同。
与Linux共享库不同,Windows DLL通常不使用与位置无关的代码。相反,它们是相对于固定的地址定义的。但是,Windows加载程序能够在发生冲突时重定位DLL。为了支持这一点,DLL映像包含重定位部分,用于指定重定位映像时需要修改的数据。许多intra-dll符号引用将使用“eip”(或rip)相对寻址,因此可能不需要在DLL重定位时修改它们。
始终相对于可执行映像的基址指定映像文件重定位。对象文件重定位是相对于符号表中符号的地址(在图像内,使用图像首选地址)指定的。图像文件没有符号表(它们有IAT,但这不是符号表)。目标文件中支持的重定位集比图像文件中支持的集更丰富。
细节在PE / COFF规范的“COFF Relocations(Object Only)”部分中介绍(我在查看版本3时输入此内容)。