
_START_ARTICLE_
可移植可执行
_START_SECTION_
MS-DOS头与MS-DOS stub
_START_PARAGRAPH_
MS-DOS头和MS-DOS Stub只存在于映像文件中。在MS-DOS下运行该应用程序，默认的Stub会打印出消息"This program cannot be run in DOS mode"。 MS-DOS头的偏移位置0x3C处包括指向PE签名的文件指针，用于定位PE的开始位置。
_START_SECTION_
COFF file header
_START_PARAGRAPH_
PE签名是一个4字节的项：字符P和E，随后是2个空字节。_NEWLINE_在Winnt.h中定义的标准COFF头的结构_IMAGE_FILE_HEADER
_START_SECTION_
optional header
_START_PARAGRAPH_
Object文件不含这部分，所以称为“可选头”。_NEWLINE_在Winnt.h中定义的optional header的结构_IMAGE_OPTIONAL_HEADER
_START_SECTION_
字符串表
_START_PARAGRAPH_
字符串表保存长度大于8的符号。字符串表紧随符号表。首先读出4个字节，为符号表的字节长度。随后的4个字节总为0。到符号表的引用地址总是从这4个0字节开始。示例代码如下：_NEWLINE_    int i;_NEWLINE_    char *s;_NEWLINE_    read(fd, &i, 4);_NEWLINE_    s = (char *)malloc(i);_NEWLINE_    memset(s, 0, 4);_NEWLINE_    read(fd, s+4, i-4);
_START_SECTION_
行号
_START_PARAGRAPH_
typedef struct {_NEWLINE_  union {_NEWLINE_    unsigned long l_symndx;  /* function name symbol index */_NEWLINE_    unsigned long l_paddr;   /* address of line number     */_NEWLINE_  } l_addr;_NEWLINE_  unsigned short l_lnno;     /* line number                */} LINENO;_NEWLINE_每个可执行的节有自己的行号表. 节中的每个函数独立编号,函数的首行(有左花括号的行)编号为1. 每个函数在行号表中有一个条目, 其l_lnno为0, l_symndx为符号表中该函数. 其后是该函数每一行的条目, l_lnno甚至为该函数内的行号(1..N), l_paddr设置为该行的第一条汇编代码的地址. _NEWLINE_为得到绝对行号, 需要在符号表中找到该函数的"beginning of function" symbol (类型C_FCN)为该函数的绝对行号,然后加上函数内的相对行号.