您的位置:首页 > 其它

源文件到目标文件的过程

2013-01-24 14:42 225 查看
用高级C语言写成的hello.c源文件能够被人读懂,但为了在系统上运行hello.c程序,每条C语言都必须转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打包,并以二进制磁盘文件形式存放起来。

源文件到目标文件的转化是由编译器驱动程序完成的。

[html] view
plaincopy

> gcc -o hello hello.c  

GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。

翻译的过程可分为四个阶段,分别由四个程序(预处理器、编译器、汇编器、链接器)来执行,这四个程序一起构成了编译系统。



一、预处理阶段

(1)把“include”文件复制到要编译的源文件中;

(2)用实际值替代“define”文本;

(3)在调用宏的地方进行宏替换。

下面以一个例子pre_test.c来说明(2)(3)

[cpp] view
plaincopy

#define PRICE 10  

main()  

{  

    #ifndef PRICE  

        printf("PRICE is not defined.\n");  

    #else  

        printf("PRICE is defined.\n");  

    #endif  

}  

只执行预处理命令

[cpp] view
plaincopy

> gcc -E -o pre_test.i pre_test.c  

在Cygwin中执行上述命令后查看pre_test.i内容如下:



二、编译阶段

使用编译器产生汇编代码,之所以产生汇编代码是因为汇编语言为不同高级语言的不同编译器提供了通用的输出语言。

[cpp] view
plaincopy

> gcc -S test.c  

执行上述命令后,会产生汇编代码test.s文件,实际上是一段AT&T汇编语言代码。

可以查看一个helloworld程序的汇编代码:



三、汇编阶段

使用汇编器将汇编语言翻译成机器语言指令。这些指令打包成一种叫做可重定位目标程序的格式,保存到扩展名为.o的文件。

命令如下:

[cpp] view
plaincopy

> gcc -c test.c  

或者从上一步产生的汇编代码中产生:

[cpp] view
plaincopy

gcc -c test.s  

四、链接阶段

比如test.c程序中存在printf函数,printf函数存在一个名为printf.o的单独预编译好了的目标文件。在链接阶段,链接器就负责把这个文件以某种方式合并到我们的test.o文件中并将其转换成可执行目标文件test文件。

[cpp] view
plaincopy

gcc -o test test.o  

可执行文件可以被加载到内存中,由系统执行。

[cpp] view
plaincopy

./test  

几种名称对应的英文:

编译系统:Compilation System

可重定位目标程序:Relocatable Object Program

预处理(预编译):Preprocessing

预处理器:cpp

编译:Compilation

编译器:ccl

汇编:Assembly

汇编器:as

链接:Linking

链接器:ld
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编译原理