gcc工作流程
2017-10-04 00:12
246 查看
在 C 程序的编译过程中,依次要进行预处理、编译、汇编、链接四个阶段。这里通过编译 C 文件 test.c 来展示 GCC 的工作流程。
例如:
l test.c
#include <stdio.h> int main()
{
printf(“Hello world!\n”); return 0;
}
1. 预处理阶段
由于在 test.c 中使用了头文件 stdio.h,所以 GCC 在编译时首先要把头文件 stdio.h
中的内容加载到 test.c 中的首部。
在 shell 中输入命令“gcc -E test.c -o test.i”。其中,参数 E 告诉 gcc 命令只进行预编译,不做其他处理;参数 o 用来指明输出的文件名为 test.i。命令运行完毕后就会产生一个
名为 test.i 的文件。如下所示:
[root@localhost home]#gcc -E test.c -o test.i
[root@localhost home]#ls
test.c test.i test.i
2. 编译阶段
编译阶段是整个编译过程中最复杂的一个阶段。这里拿自然语言的翻译过程作个对比。比如在把“I love China”翻译成中文前,需要依次完成以下几个步骤:
1)考察这个句子中每个单词的拼写是不是正确。
2)考察整个句子的语法(比如主谓宾、定状补的结构等)是不是正确。
3)考察整个句子的语义是不是正确。
只有以上三个步骤都正常通过了,才能保证句子被正确翻译。同样,高级编程语言的编译阶段也必须实现这三个步骤。
1) 步骤 1 称为词法分析,主要负责检查关键字、标识符等是否正确。
2) 步骤 2 称为语法分析,主要负责检查程序中语句的语法是否正确。
3) 步骤 3 称为语义分析,主要负责检查程序中语句的逻辑意义是否正确。
在 shell 中输入命令“gcc -S test.i -o test.s”。其中,参数 S 告诉 gcc 命令只进行编译,不做其他处理。命令运行完毕后就会产生一个名为 test.s 的汇编文件。如下所示:
[root@localhost home]#gcc -S test.i -o test.s
[root@localhost home]#ls
test.c test.i test.s
3. 汇编阶段
汇编阶段的任务是把汇编程序翻译成 CPU 可以识别的二进制文件,该文件又称为目标文件。
在 shell 中输入命令“gcc -c test.s -o test.o”,其中,参数 c 告诉 gcc 命令只进行汇编,不做其他处理。命令运行完毕后就会产生一个名为 test.o 的目标文件。如下所示:
[root@localhost home]#gcc -c test.s -o test.o
[root@localhost home]#ls
test.c test.i test.o test.s
在 Windows 系统中,目标文件的后缀是 obj。
3. 链接阶段
目标文件虽然已经可以被 CPU 直接识别,但是单个目标文件一般是无法运行的。原因在于一个程序往往是由多个源文件组成的,每个源文件只对应一个目标文件。也许有人会
问, test 程序不就只有一个源文件 test.c 吗,为什么也不能直接运行呢?原因是 test.c 使用了 stdio.h 对应的库函数,所以必须要把 test.o 文件和函数库文件链接在一起才能运
行。
链接阶段的任务就是把程序中所有的目标文件和所需的库文件都链接在一起,最终生成一个可以直接运行的文件,称为可执行文件。
在 shell 中输入命令“gcc test.o -o test”,运行完毕后就会产生一个名为 test 的
可执行文件。输入命令“./test”执行该文件,就可以得到 test 文件的运行结果“Hello world!”。如下所示:
[root@localhost home]#gcc test.o -o test
[root@localhost home]#./test
Hello world!
gcc 命令生成的可执行文件的有以下三种格式。
1)a.out(Assembler and Link editor output);
2)COFF(Common object file format);
3)ELF(Executable and linkable format);
其中,a.out 和 COFF 格式都是比较老的格式,现在 Linux 平台上可执行文件的主流格式是 ELF。
例如:
l test.c
#include <stdio.h> int main()
{
printf(“Hello world!\n”); return 0;
}
1. 预处理阶段
由于在 test.c 中使用了头文件 stdio.h,所以 GCC 在编译时首先要把头文件 stdio.h
中的内容加载到 test.c 中的首部。
在 shell 中输入命令“gcc -E test.c -o test.i”。其中,参数 E 告诉 gcc 命令只进行预编译,不做其他处理;参数 o 用来指明输出的文件名为 test.i。命令运行完毕后就会产生一个
名为 test.i 的文件。如下所示:
[root@localhost home]#gcc -E test.c -o test.i
[root@localhost home]#ls
test.c test.i test.i
2. 编译阶段
编译阶段是整个编译过程中最复杂的一个阶段。这里拿自然语言的翻译过程作个对比。比如在把“I love China”翻译成中文前,需要依次完成以下几个步骤:
1)考察这个句子中每个单词的拼写是不是正确。
2)考察整个句子的语法(比如主谓宾、定状补的结构等)是不是正确。
3)考察整个句子的语义是不是正确。
只有以上三个步骤都正常通过了,才能保证句子被正确翻译。同样,高级编程语言的编译阶段也必须实现这三个步骤。
1) 步骤 1 称为词法分析,主要负责检查关键字、标识符等是否正确。
2) 步骤 2 称为语法分析,主要负责检查程序中语句的语法是否正确。
3) 步骤 3 称为语义分析,主要负责检查程序中语句的逻辑意义是否正确。
在 shell 中输入命令“gcc -S test.i -o test.s”。其中,参数 S 告诉 gcc 命令只进行编译,不做其他处理。命令运行完毕后就会产生一个名为 test.s 的汇编文件。如下所示:
[root@localhost home]#gcc -S test.i -o test.s
[root@localhost home]#ls
test.c test.i test.s
3. 汇编阶段
汇编阶段的任务是把汇编程序翻译成 CPU 可以识别的二进制文件,该文件又称为目标文件。
在 shell 中输入命令“gcc -c test.s -o test.o”,其中,参数 c 告诉 gcc 命令只进行汇编,不做其他处理。命令运行完毕后就会产生一个名为 test.o 的目标文件。如下所示:
[root@localhost home]#gcc -c test.s -o test.o
[root@localhost home]#ls
test.c test.i test.o test.s
在 Windows 系统中,目标文件的后缀是 obj。
3. 链接阶段
目标文件虽然已经可以被 CPU 直接识别,但是单个目标文件一般是无法运行的。原因在于一个程序往往是由多个源文件组成的,每个源文件只对应一个目标文件。也许有人会
问, test 程序不就只有一个源文件 test.c 吗,为什么也不能直接运行呢?原因是 test.c 使用了 stdio.h 对应的库函数,所以必须要把 test.o 文件和函数库文件链接在一起才能运
行。
链接阶段的任务就是把程序中所有的目标文件和所需的库文件都链接在一起,最终生成一个可以直接运行的文件,称为可执行文件。
在 shell 中输入命令“gcc test.o -o test”,运行完毕后就会产生一个名为 test 的
可执行文件。输入命令“./test”执行该文件,就可以得到 test 文件的运行结果“Hello world!”。如下所示:
[root@localhost home]#gcc test.o -o test
[root@localhost home]#./test
Hello world!
gcc 命令生成的可执行文件的有以下三种格式。
1)a.out(Assembler and Link editor output);
2)COFF(Common object file format);
3)ELF(Executable and linkable format);
其中,a.out 和 COFF 格式都是比较老的格式,现在 Linux 平台上可执行文件的主流格式是 ELF。
相关文章推荐
- gcc编译器的工作流程
- makefile: gcc 工作流程
- gcc编译器 命令常用选项及工作流程 截图
- Gcc编译器的工作流程
- Struts1工作流程
- 搜索引擎工作的基础流程与原理
- struts2的工作流程
- Linux USB驱动工作流程
- SharePoint 轻量化工作流之Hr招聘系统之 利用SharePoint Designer 规划工作流程!
- Git --基本工作流程
- 域名服务的工作流程
- 从NSURLSession下载和断点续传到NSURLSession使用说明及后台工作流程分析
- SpringMVC工作流程
- Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析
- 遵循ITIL流程框架,运维工作进入规范化新纪元――黑龙江远大购物中心
- 编译原理学习周入门教程--(2)编译程序的六个工作流程
- Phone 通话过程中 PSensor 工作流程
- Git工作流程
- Android Wifi的工作流程
- GCC编译流程