PE格式的DOS头中的"e_lfanew"是什么意思?

8
在PE(Windows可执行文件)格式的IMAGE_DOS_HEADER中,有一个称为e_lfanew的字段,它在指向实际PE头数据方面发挥着非常重要的作用。
我的问题是,“e_lfanew”到底代表什么?它是什么意思?这个名字太神秘了。
编辑:我不是在问它的作用,我知道它的作用,我想知道e_lfanew中的字母实际上代表什么,为什么会被赋予这个名称?

@i486 我不是在问它做什么,我知道它做什么,我想知道e_lfanew中的字母实际上代表什么,为什么要给它这个名称? - horseyguy
3
从WinNT.h:LONG e_lfanew; //新exe头文件的文件地址e_前缀有助于处理旧的K&R编译器,它们尚未将结构成员保留在自己的符号表中。 l是LONG的系统匈牙利语。 您可以猜测fanew的含义。 现在您知道了,您会怎么做呢? - Hans Passant
2
@HansPassant 谢谢!我想我会喝一杯庆祝一下 :) 这真是激发了我的好奇心! - horseyguy
1个回答

22

我的理解是它是New Executable头文件的逻辑文件地址

主要基于这个P/Invoke C#定义中的注释IMAGE_DOS_HEADER结构:

public Int32 e_lfanew;      // File address of new exe header

还有@Hans Passant的评论:

e_前缀有助于处理旧的K&R编译器,因为它没有将结构成员保存在自己的符号表中。

@Simon Kissane在这里发表了后来的评论:

IMAGE_DOS_HEADER内部有两个以e_lfa开头的字段:

  • WORD e_lfarlc; // 重定位表的文件地址
  • LONG e_lfanew; // 新exe头的文件地址

"lfa"似乎意味着"逻辑文件地址",即相对于可执行文件开头的偏移量。


2
这是一个好的猜测,但我不认为long部分是正确的。在IMAGE_DOS_HEADER内有两个以e_lfa开头的字段:WORD e_lfarlc; // 重定位表的文件地址LONG e_lfanew; // 新exe头的文件地址e_lfanew是一个LONG(32位),但e_lfarlc是一个WORD(16位,即short)。显然,fa表示“文件地址”,但我怀疑l代表的不是“long”。我相信“lfa”实际上是“逻辑文件地址”,这是从文件开始偏移量的旧术语。在现代PE格式中,同样的概念被称为RVA(相对虚拟地址)。 - Simon Kissane
谢谢Simon,已更新。 - CodeCaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接