第3章 GCC编译程序集合及相关工具
3.1 gcc基本应用
GCC全称为 GNU 编译程序集合,它集成了预处理器,汇编编译器以及链接器等很多实用工具。对于c语言的编译过程来说,可以分为以下几个步骤:首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入以#键开头的语句所包含的内容;接着,GCC会调用ccl将c语言编译成汇编代码;然后as将处理后的汇编代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。它的基本步骤如下:
预处理: gcc -E -o test.i test.c
编译: gcc -S -o test.s test.i
汇编: gcc -c -o test.o test.s
链接: ld -o test test.o
3.2 gcc常用编译选项
-E:预处理,生成纯C文件,后缀为.i
-S:编译,生成汇编文件,后缀为.s
-c:汇编,生成目标文件,后缀为.o
-o:生成可执行文件
-x lauguage:指定使用的语言
-L library:指定所使用的库文件
-I directory:为include文件搜索指定路径
-g:插入符号信息便于调试
-w:禁止一切警告
-Wall:打开所有警告
-padantic:严格要求符合ANSI标准
-pg:产生gprof所用信息
-O(O1,O2,O3):对代码进行优化
-m*** : 根据不同处理器进行优化
3. 3警告
在gcc中常用-Wall选项打开所有警告信息,而用-w关闭警告。
3.4 调试
在使用gdb进行调试之前,必须在编译时加入-g调试选项,使得gcc在目标文件和可执行文件中加入额外的符号信息,这些信息能使gdb更有效的进行调试。
3.5 优化
优化是编译器的一部分,它可以是生成的代码更有效率。在gcc中,我们可以使用-O1,O2,O3选项来对代码进行优化,其数字越高,代表gc优化级别越高。但是,优化可能会带来一些负面的影响。例如,优化过程可能占用太多时间,或者优化后的代码会占用更多更大的内存空间,另外,优化级别越高,调试的难度可能会越大,因为优化器可能为了更有效率而重组许多声明,或者删除某些无用的代码。所以,优化过程最好选在开发工作快要结束的时候,而且优化级别一般为O2。
3.6其它工具介绍
1:c预处理器cpp:完成宏的求值,条件编译,处理包含文件以及其它以‘#’开头的标志。
2:ccl编译器:将处理之后的纯C文件编译成汇编,以供汇编器汇编
3:汇编器as:gcc在编译程序时会生成汇编代码,as会处理这些代码,从而生成目标文件。
4:链接器ld:将多个目标文件组合起来,并结合函数库和初始化代码,产生可执行文件。
5:文件处理器ar:建立静态库,把几个小文件组合成一个大文件。
5:库显示ldd:显示可执行文件使用的共享文件库。
6:calls:输出文件里函数的调用树图。
7:indent:使源代码产生统一的缩进格式。
8:gprof:显示程序中每个函数被调用次数和每个函数的执行时间。(由于gprof的分析数据很多,查看这些数据的时候,最好将输出重定向到指定的文件中。)
9:objdump:显示目标文件和库的信息。
10:nm : 列出目标文件中定义的符号。
12:size : 列出目标文件每部分的名字和尺寸。
13: make:读取makefile脚本来确定程序中哪一部分需要汇编和链接,然后执行相关命令。