3.3 C语言程序
GNU gcc对ISO标准C89描述的C语言进行了一些扩展,其中一些扩展部分已经包括进ISO C99标准中。本节给出内核中经常用到的一些gcc扩充语句的说明。在后面章节的程序注释中也会随时对遇到的扩展语句给出简单的说明。
3.3.1 C程序编译和链接
使用gcc汇编器编译C语言程序时通常会经过4个处理阶段,即预处理阶段、编译阶段、汇编阶段和链接阶段,如图3-3所示。
|
| (点击查看大图)图3-3 C程序编译过程 |
在预处理阶段中,gcc会把C程序传递给C前处理器cpp,对C语言程序中指示符和宏进行替换处理,输出纯C语言代码;在编译阶段,gcc把C语言程序编译生成对应的与机器相关的as汇编语言代码;在汇编阶段,as汇编器会把汇编代码转换成机器指令,并以特定二进制格式输出保存在目标文件中;最后GNU ld链接器把程序的相关目标文件组合链接在一起,生成程序的可执行映像文件。调用gcc的命令行格式与编译汇编语言的格式类似:
gcc [ 选项 ] [ -o outfile ] infile ... |
其中infile是输入的C语言文件;outfile是编译产生的输出文件。
对于某次编译过程,并非一定要全部执行这4个阶段,使用命令行选项可以令gcc编译过程在某个处理阶段后就停止执行。例如,使用"-S"选项可以让gcc在输出了C程序对应的汇编语言程序之后就停止运行;使用"-c"选项可以让gcc只生成目标文件而不执行链接处理,如下所示。
gcc -o hello hello.c // 编译hello.c程序,生成执行文件hello。 gcc -S -o hello.s hello.c // 编译hello.c程序,生成对应汇编程序hello.s。 gcc -c -o hello.o hello.c // 编译hello.c程序,生成对应目标文件hello.o而不链接。
|
在编译像Linux 内核这样的包含很多源程序文件的大型程序时,通常使用make工具软件对整个程序的编译过程进行自动管理,详见后面说明。