如何在部分上使用 fixups 属性?

How to use the fixups attribute on a section?

"fixups" 应用于某个部分时究竟有什么作用? 在一个 fasm 示例中,我发现了以下部分 delcaration,我真的不确定 fixups 属性的作用,我在 fasm 文档中找不到太多关于它的信息。

section '.reloc' fixups data readable discardable
if $=$$
    dd 0,8          ; if there are no fixups, generate dummy entry
end if

fixups 只是 重定位条目 .
的另一个名称 如果您不熟悉 PE 上的搬迁,take a look at the official specifications


重定位条目告诉加载程序如何修复(因此得名 fixups)编译代码中的地址。

fixups 指令告诉 FASM 声明的部分是应该(自动)生成重定位条目的部分。 不过,您仍然可以添加数据,大概是在任何用户提供的数据 1 之前编写了修正。

测试if $=$$检查当前地址计数器($)是否等于该部分开始时地址计数器的值($$)。
如果是这样,用户数据将写入该部分的开头,因此不会生成修正。

两个双字 dd 0, 8 创建一个空条目(虚拟条目)。
第二个 DWORD 指定整个条目的长度,包括 8 个字节 header,值为 8 表示没有其他数据。


我不知道为什么要创建这样的虚拟条目。


1 只是从片段中推断出来的,我不确定。

这似乎是 bug in how FASM generates PECOFF DLLs 的解决方法。 .reloc 部分仅适用于 PECOFF 图像(EXE 和 DLL),并提供允许在任何地址加载图像的重定位(或 "fixups")。 (PECOFF 目标文件中使用了不同类型的重定位;这些修正未放在 .reloc 部分中。)

FASM 中的错误是,如果 DLL 不需要任何重定位而不是根本不生成,它将生成一个空的 .reloc 部分。 Windows 如果有一个空白部分,将拒绝加载 DLL(或 EXE)。如果 .reloc 部分没有任何内容,则通过添加虚拟 "base relocation block" 来强制非空 .reloc 部分。

显然 FASM 的开发者认为这不是 FASM 中的错误,而是 Windows 中的错误,因此没有修复它。

为了直接回答您的问题,fixups 关键字似乎表明该部分是 FASM 的特殊部分,它用于如上所述的图像重定位。与其他属性不同,它不对应于 PECOFF 图像中使用的部分标志之一,因此它似乎仅由 FASM 内部使用。