可执行文件是否需要首选加载地址并因此保留位置相关代码而不是简单地在整个文件中使用RVAs? 对我而言,这看起来像是一个重大的设计缺陷,我不明白人们甚至会想出这个想法。
答案 0 :(得分:2)
我猜原因更具历史性而非实际性。
引用Matt Pietrek,来自他众所周知的“Peering Inside the PE”:
众所周知,Windows NT具有VAX®VMS®和UNIX® 遗产。许多Windows NT创建者为这些设计和编码 来微软之前的平台。什么时候设计 在Windows NT中,他们试图最小化它们是很自然的 使用以前编写和测试的工具进行引导时间。该 这些工具生成的可执行文件和对象模块格式 与之合作的是COFF(公共对象文件格式的首字母缩写)。 [...] COFF格式本身是一个很好的起点,但需要 扩展以满足现代操作系统的所有需求 Windows NT或Windows 95.此更新的结果是Portable 可执行格式。
因此PE格式基于COFF格式,后者具有relocations的概念:它们允许系统(更准确地说系统的Loader)通过修补位置相关地址在运行时重新定义PE。
official PE documentation明确地将重定位命名为“COFF Relocations”,所以我猜PE重定位是从COFF继承的,并不是PE格式本身带来的新增加。
总而言之,我的猜测是,一个独立的位置被丢弃(如果考虑过),因为COFF格式已经具有实现相同特征的重定位概念。