PE 文件格式详解 (一) 基础知识 什么是 P E 文件格式: 我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE 文件格式便是一种文件组织形式,它是 32位 Window 系统中的可执行文件 EXE 以及动态连接库文件 DLL 的组织形式。为什么我们双击一个EXE 文件之后它就会被 Window 运行,而我们双击一个 DOC 文件就会被 Word 打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如 EXE 文件中的代码,数据等,DOC文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE 文件的使用者就是 Window,而 DOC 文件的使用者就是 Word。Window 可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么 PE 文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和联结生成PE 文件的时候对其中的那些 Window 需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window 中默认的信息。例如:WindowNT 默认的程序加载基址是 0x40000;你可以在用 VC 连接生成EXE 文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在 Linux上就有一种流行的 ELF 格式;当然它是由在 Linux上的编译器和连接器生成的,所以编译器、连接器是针对不同的 CPU 架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑 Linux的 X86 机器上编译出能在 Arm 上运行的程序。 程序是如何运行起来的: 一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑源文件;然后使用编译器编译程目标文件 OBJ,这里面涉及到编译原理的知识;连接器把 OBJ 文件和其他一些库文件和资源文件连接起来生成EXE 文件,这里面涉及到不同的连接器的知识,连接器根据 OS 的需要生成EXE 文件保存着磁盘上;当我们运行 EXE 文件的时候有 Window 的加载器负责把 E...