@oro-oro
2015-08-18T11:17:03.000000Z
字数 1358
阅读 2157
AndroidARM
目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),而Android使用的是ARM版本。
使用GCC编译程序时,编译过程可以被细分为四个阶段:
预处理(Pre-Processing)
对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理。
$ gcc -E hello.c -o hello.i //得到预处理后的文件。
编译(Compiling)
把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。
在使用GCC进行编译时,缺省情况下,不输出这个汇编代码的文件。如果需要,可以在编译时指定-S选项。
$ gcc -S hello.i -o hello.s //hello.s 是后续要研究的代码。
注:现在版本的GCC把预处理和编译两个步骤合成一个步骤,用cc1工具来完成。
$ cc1 hello.c
汇编(Assembling)
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。
汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
$ gcc -c hello.s -o hello.o
$ as hello.s –o hello.co
hello.o/hello.co 的内容为机器码。
链接(Linking)
链接会将函数库中相应的代码组合到目标文件中,最终生成可执行文件。
hello.c 没有定义“printf”的函数实现,且在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,Linux中printf函数实现都在libc.so.6的库文件中,在没有特别指定时,GCC会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这就是链接。
$ gcc hello.o -o hello
hello.c 的整个编译过程:
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。