源文件到目标文件的过程
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
源文件到目标文件的转化是由编译器驱动程序完成的。
[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
相关文章推荐
- Linux内核Makefile编译生成内核目标文件的过程
- 从源程序到目标文件的生成过程
- 【编译原理】源文件生成目标文件的过程
- Linux下如何将源文件逐步编译成目标文件的过程
- rt-thread装载共享目标文件的过程源码分析
- 源文件到目标文件的过程
- 在Linux环境下查看目标文件生成过程
- Linux内核Makefile编译生成内核目标文件的过程
- Linux下将源文件编译成目标文件的过程解析
- Linux内核Makefile编译生成内核目标文件的过程
- make生成目标文件过程
- 在Unix系统上,从源文件、目标文件、可执行文件的编译过程
- Linux内核Makefile编译生成内核目标文件的过程
- C语言生成中间目标文件的大致过程
- 由.c源码到可执行目标文件的过程
- 通过ssh上传文件到目标主机
- java调用dll文件处理过程
- ubuntu11.10下为android模拟器编译内核到为android开发内核模块(.ko文件)全过程纪实
- 典型的ELF可重定位目标文件
- 源码分析setContentView加载布局文件的过程