我的理解(主要来自可移植可执行文件格式的Wikipedia's article),Windows DLL不使用与位置无关的代码,而是具有链接时定义的首选基地址。如果有两个图书馆'但是,基地址冲突需要通过其重定位表重新定位。
此PE重定位是否类似于ELF的GOT和PLT(.data部分中的进程本地表,需要每个绝对地址通过间接),或者它更像是动态重定位(在加载时) -time所有绝对地址都被翻译了)?如果是后者,这在x64上有问题吗?
答案 0 :(得分:2)
WIN32和WIN64之间的情况有所不同。
对于存在重定位信息的WIN32图像(通常是非EXE),二进制代码中的所有绝对地址都具有相应的修正记录,以便在模块的情况下可以通过加载程序修补地址。首选的加载地址已被其他东西占用。
对于WIN64图像,情况原则上类似,但实际上几乎所有64位指令实际上都使用位置无关编码,其中偏移是IP相对的而不是绝对的,因此需要更少的重定位修正(如果在全部)。