[翻译] 简谈编译、汇编、链接和加载 – part I
Tanslated from: http://www.tenouk.com/ModuleW.html
本文详细介绍了一个C/C++程序从源文件到进程的过程。但它仍然只是我的一个缓冲溢出教程的节选。本文试图解释C/C++源码如何经历预处理(pre-processed)、编译(compiled)、链接(linked)以及最后被加载(loaded)为一个运行的进程(process)的过程。文章基于GCC。如果你使用了某个集成的IDE编程环境,那么这些过程就被这些IDE隐藏了。
W.1 编译器(compiler),汇编器(assembler)和链接器(linker)
不管使用何种操作系统或编程工具,C程序的编译过程一般有四步:预处理,编译,汇编和加载,直至最后变为一个单一的可执行文件。
预处理:处理包含文件,条件编译指令以及宏(Macros)
编译:将预处理过的源文件编译成汇编语言文件
汇编:将汇编语言文件转成带有偏移量的机器指令(assembly listing with offsets)。结果存储在一个对象文件中。
链接:将一个或多个对象文件以及库文件组合成一个(通常是可执行的)文件。在这个过程中,链接器需要解决外部对象的引用,为函数或过程调用和变量分配地址,更改代码块和数据以匹配新的地址(relocation).
下表列出了源文件的扩展名及其需要进行的处理:
文件扩展名 | 描述 |
file_name.c | C源文件,需要进行预处理 |
file_name.i | C源文件。不需要预处理。 |
file_name.ii | C++ 源文件。不需要预处理。 |
file_name.h | C 头文件 (不需要编译或链接。). |
file_name.cc
file_name.cp file_name.cxx file_name.cpp file_name.c++ file_name.C |
C++源文件。需要进行预处理 。对于 file_name.cxx文件名, xx 必须就是两个小写的字母x 而 file_name.C, 最后的必须是大写字母C。 |
file_name.s | 汇编代码. |
file_name.S | 汇编代码. 需要进行预处理 |
file_name.o | 默认的对象文件名。通常就是源文件加上 .o后缀。 |
下图则以图像的方式描述了从源文件到编译好的程序被加载为进程的过程:
— 待续