Windows对象文件COFF重新定位说明

Windows对象文件COFF重新定位说明,windows,object,x86-64,relocation,coff,Windows,Object,X86 64,Relocation,Coff,我试图创建一个x86-64 Windows COFF对象文件,但我不完全理解中描述的不同类型的重新定位。具体地说,我不确定你要做什么(包括变体),IMAGE\u REL\u AMD64\u REL32,IMAGE\u REL\u AMD64\u SREL32,IMAGE\u REL\u AMD64\u PAIR和IMAGE\u REL\u AMD64\u SSPAN32。有一些关于它们的文档,但描述不够,我找不到任何引用这些文档的外部资源。更准确地说,我不知道“依赖于跨度的值”是什么意思,也不知

我试图创建一个x86-64 Windows COFF对象文件,但我不完全理解中描述的不同类型的重新定位。具体地说,我不确定你要做什么(包括变体),
IMAGE\u REL\u AMD64\u REL32
IMAGE\u REL\u AMD64\u SREL32
IMAGE\u REL\u AMD64\u PAIR
IMAGE\u REL\u AMD64\u SSPAN32
。有一些关于它们的文档,但描述不够,我找不到任何引用这些文档的外部资源。更准确地说,我不知道“依赖于跨度的值”是什么意思,也不知道REL32的值到底是相对于什么的。如果您能提供这方面的任何信息,我将不胜感激


编辑:好的,经过一番思考,我明白了REL32是用于RIP相对寻址的,变量是用于地址相对于指令开始位置偏移量,符号指向指令开始位置的情况。我仍然想知道,当重新定位的dword对象不是编码指令体中的最后一个字段时,例如,当相对位移后面紧跟着以1或4字节编码的立即值时,会使用
IMAGE\u REL\u AMD64\u REL32
的变体,SREL32、PAIR和SSPAN32是干什么用的。除了COFF模块中的
REL32*
ADDR*
之外,我从未见过其他重新定位类型。也许我们可以忽略它们,因为它们是软件架构师丰富想象力的产物?谢谢!我想我们可以,但老实说,我还是很好奇)顺便说一句,我已经检查过github上目前没有任何东西使用SREL32。(在过滤了大量流行存储库的分支后,它只被提到或定义为枚举成员,只剩下51个分支,而实际使用它的分支都没有。这甚至包括Ghidra不知道如何处理它)。我打算在我有一点空闲时间的时候为他们进行一个小型的手动测试。也许你也可以查看GNU ld的来源。这个Linux链接器知道如何链接COFF格式,所以它应该以某种方式处理SREL32。谢谢你的建议。我试过了,但它似乎忽略了这些。对于X86_64,它有一个14(0xe)重定位,但将其用于伪reloc(“Pseude PC64重定位-注意:MS/AMD未指定,但需要由ELF生成的gas pc相对64位宽重定位”),因此无论如何都不是SREL32。对于较高的数字,对应于PAIR和SSPAN32,没有任何定义