0

我有一个 PE 文件(记事本),NumberOfRvaAndSizeCOFF 标头中的值为,并且按预期0x10有 16个条目。DataDirectory

文档说这个值可以改变(尽管我从未见过),这意味着有大于或小于 16 个条目。

紧随其后的是一个包含 16 个数据目录的列表,其中包含名称。

  1. 这些名称是否总是相同的,按照确切的顺序?
  2. 如果数量较少,是否总是会丢失最后的目录?
  3. 如果超过 16 个,它们被分配了哪些名称?
4

1 回答 1

0

这始终是规范与实现的问题。

这些名称是否总是相同的,按照确切的顺序?

至于名称(我猜您指的是部分名称?),不可以更改。.reloc尽管大多数实现(即链接器)将保留规范名称(例如用于重定位),但您可以随意命名它们。

顺序是固定的;您可以通过它们的编号来引用它们。

如果数量较少,是否总是会丢失最后的目录?

我不确定有效的 PE(可以由实际支持的系统加载)的数据目录少于 16 个。尽管部分标题的位置可能是使用FILE_HEADER.SizeOfOptionalHeader.

加载 PE 文件的参考实现(Windows Loader)不是开源的,所以回答这个问题并不容易。

我的猜测是它可以工作:这就像试图在 Windows 10 系统上加载一个 win2K PE(假设它正在导入仍然存在于 Windows 10 系统上的功能)。就像 CLR 数据目录不存在一样。

如果超过 16 个,它们被分配了哪些名称?

您不能拥有超过 16 个数据目录,因为最大数量16。我很确定 Windows 加载程序不会加载超过 16 个数据目录的 PE 文件。

文档说这个值可以改变(尽管我从未见过),这意味着有大于或小于 16 个条目。

这个数字现在固定为16。例如,最后添加的是 CLR 数据目录,它被添加以加载 CLR 并引入 .NET。在那之前,这个数字是 15,所以是的,这个值可以改变,并不总是 16,但这并不意味着它在 PE 之间改变。我的意思是,在给定时间,对于受支持的系统,所有 PE 将具有相同数量的数据目录。

我的猜测是,在引入 .NET(带有 CLR 数据目录)时,PE 有 15 个数据目录,而其他的有 16 个。Windows 加载程序可能已修补以解决这两个不同的数字。现在,这个数字很可能固定为 16。

于 2018-09-25T14:15:56.580 回答