4. Windows PE【《链接、装载与库》学习笔记】

PE与ELF都是由COFF(Common Object File Format)发展而来。与ELF相同,PE/COFF格式也采用基于段的格式

COFF

在windows上编译:

1
cl /c .Za SimpleSection.c

/c:只编译,不链接。/Za:禁止使用VISUAL C++的语法扩展。

使用dumpbin查看目标文件的结构:
dumpbin /ALL SimpleSection.obj > SimpleSection.txt

COFF的文件头部包含两部分:描述总体结构和属性的映像头(Image Header)和描述文件中包含段属性的段表(Section Table),文件头后面紧跟文件的段,包含代码段、数据段等。

链接指示信息

.drectve是Directive的缩写,是编译器传递给链接器的指令,即编译器希望告诉链接器应该怎样链接目标文件,段名后面是段的属性。

LIBCMT的全称是(Library C Multithreaded),表示VC的静态链接的多线程C库

调试信息

COFF文件中所有以.debug开始的段包含调试信息,比如.debug$S表示包含符号相关额调试信息段,.debug$P表示包含预编译头文件.debug$T表示包含类型相关的调试信息段。

COFF符号表

最后部分是COFF符号表,内容几乎与ELF符号表一样。

对C语言的符号,COFF只区分两种,一种是变量和其他符号notype,函数notype()

PE

PE是基于COFF的扩展,主要变化为:

  1. 文件开始部分不是COFF文件头,而是DOS MZ可执行文件格式的文件头和桩代码(DOS MZ File Header and Stub
  2. 原来COFF文件头的IMAGE_FILE_HEADER部分扩展成了PE文件文件头结构IMAGE_NT_HEADERS。包含原来的Image Header以及新增的PE扩展头部结构(PE Optional Header)

DOS下可执行文件的格式是MZ格式,一样使用.exe后缀。

IMAGE_NT_HEADERS中的e_lfanew成员表明了PE文件头在PE文件中的偏移(在DOS的MZ文件格式中永远为0)。IMAGE_NT_HEADERS包含的标记(Signature)是一个常量,对应"P",“E”,“\0”,"\0"的ASCII码。

PE数据目录

Windows装载PE时往往需要赫努埃找到装在所需要的数据觉狗如导入表、导出表、资源、重定位表等。这些常用数据的位置和长度被保存在数据目录(Data Directory)中,也就是IMAGE_OPTIONAL_HEADER中的DataDirectory成员。


4. Windows PE【《链接、装载与库》学习笔记】
http://blog.bluspace.ren/2025/12/03/4. Windows PE【《链接、装载与库》学习笔记】/
作者
Blauter
发布于
2025年12月3日
许可协议