COFF数据目录的名称是否固定?

时间:2018-09-19 13:04:22

标签: windows executable portable-executable coff

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

documentation说,这个值可以改变(尽管我从未见过),这意味着条目数少于16个。

立即有一个包含名称的16个数据目录的列表。

  1. 这些名称是否始终保持相同顺序?
  2. 如果数量更少,是否总会缺少最后的目录?
  3. 如果大于16,将为他们分配什么名字?

1 个答案:

答案 0 :(得分:0)

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

  

这些名称是否始终按照相同的顺序相同?

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

订单是固定的;您可以引用它们by their numbers

  

如果数量更少,那么目录末尾总会缺少什么吗?

我不确定有效的PE(可以由实际支持的系统加载)是否具有少于16个数据目录。由于节标题的位置可能是使用FILE_HEADER.SizeOfOptionalHeader计算出来的,因此这可能是可能的。

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

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

  

如果大于16,将为他们分配什么名字?

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

>
  

文档说此值可以更改(尽管我从未见过),这意味着条目数少于16个。

该数字现在固定为16。例如,最后添加的是CLR数据目录,该目录是通过引入.NET来加载CLR的。在此之前,该数字为15,因此可以更改该值,并且该值不会始终为16,但这并不意味着在PE之间会更改。我的意思是,对于给定的时间,对于受支持的系统,所有PE都将具有相同数量的数据目录。

我的猜测是,在引入.NET(带有CLR数据目录)时,PE包含15个数据目录,而其他PE包含16个数据目录。可能对Windows loader进行了修补,以解决这两个不同的数字。现在,这个数字很可能只固定为16。