PE DLL 的重定位 - 加载时间还是类似 ELF?

Relocation of PE DLLs - Load-time or like ELF?

据我了解(主要来自 Wikipedia's article Portable Executable 格式),Windows DLL 不使用与位置无关的代码,而是有一个 link 时间定义的首选基址。但是,如果两个库的基地址发生冲突,则需要通过其重定位 table.

来重定位一个库

这个 PE 重定位是否类似于 ELF 的 GOT 和 PLT(process-local tables in the .data sections that require each absolute address to go through indirection),还是更像是动态重定位(在加载时翻译所有绝对地址)?如果是后者,这在 x64 上有问题吗?

WIN32和WIN64情况不同

对于存在重定位信息的 WIN32 映像(通常是非 EXE),二进制代码中的所有绝对地址都有一个相应的修复记录,以便加载程序可以修补该地址,以防模块首选加载地址已经被别的东西占用了。

对于 WIN64 图像,原则上情况类似,但实际上几乎所有 64 位指令实际上都使用与位置无关的编码,其中偏移量是 IP 相关的而不是绝对的,因此需要的重定位修复要少得多(如果有的话)。