Assembly PE二进制文件中的节名真的有限制吗?

Assembly PE二进制文件中的节名真的有限制吗?,assembly,header,byte,portable-executable,sections,Assembly,Header,Byte,Portable Executable,Sections,关于PE格式的一项声明如下: 名字。每个节头都有一个长达八个字符的名称字段,其中第一个字符必须是句点 但我知道有几个例子违反了这一点,首先是二进制文件中的.gnu_debuglink部分,它们以DWARF格式分离了调试符号。另外,DWARF的.debug\u安排了,.debug\u info和其他人违反了这一点。(为了比较,PDB的“分离”部分名称只是.debug) 所以我想知道这篇文章是否已经过时/不完整,或者它可能是一个特定于Windows的指南,或者对节名的长度没有任何限制 此外,如果有人

关于PE格式的一项声明如下:

名字。每个节头都有一个长达八个字符的名称字段,其中第一个字符必须是句点

但我知道有几个例子违反了这一点,首先是二进制文件中的
.gnu_debuglink
部分,它们以DWARF格式分离了调试符号。另外,DWARF的
.debug\u安排了
.debug\u info
和其他人违反了这一点。(为了比较,PDB的“分离”部分名称只是
.debug

所以我想知道这篇文章是否已经过时/不完整,或者它可能是一个特定于Windows的指南,或者对节名的长度没有任何限制

此外,如果有人给我指出任何关于PE/COFF二进制文件的书(ELF也很好),比在线文章更全面(如果有的话),我会很高兴。或者关于一般的系统编程-关于这个主题的信息非常稀少,或者已经过时20多年了。:)

COFF中有一个“长节名”功能,用于支持节名字段中不适合的节名


对于长节名,普通节名字段包含一个类似于
/4
的名称,通常是一个
/
,后跟一些十进制数字作为ASCII字符串。它编码的数字是符号表中的一个偏移量,因此在
点tosymboltable
(从文件头开始)加上该偏移量。

对象文件中的节名没有限制,但可执行文件中的节名不能超过8字节。从:

一个8字节的空填充UTF-8编码字符串。如果字符串正好是 8个字符长,没有终止null。对于较长的名称,请使用此字段 包含后跟十进制ASCII表示形式的斜杠(/) 作为字符串表中的偏移量的数字。可执行映像不使用 字符串表,不支持长度超过8个字符的节名称。长的 如果对象文件中的名称被发送到可执行文件,则会被截断

请注意,Windows PECOFF加载程序会忽略节的名称,因此它们除了作为简单形式的调试信息外,实际上不用于任何用途


此外,名称不必以句点开头。这只是一个惯例,这样它们就不会与用户定义的符号冲突。

这些部分是PE还是ELF二进制文件?这些名称看起来很像linuxish,Dwarf是与ELF一起设计的(尽管它们现在是独立的)。PE节名称仍然限制为8个字符。PE中的节名称只有8个字节,之后是虚拟大小字段。它不是一个具有任意长度限制的字符串,而是一个碰巧包含类似字符串的值的qword。然后名称字段可能看起来像“/4”或类似的详细信息似乎很少,到目前为止,我从LLD(LLVMs链接器)源代码了解到的关于它实际工作原理的信息比任何实际解释都多(似乎没有)