通过源代码了解GCC在做什么。GCC源代码分析
一、海合会的作用和运作机制
GCC是Linux下重要的编译工具,这里就不说它的用法了,满大街都是。这里我重点介绍GCC的运行机制,作为代码分析的铺垫。整篇文章用C语言子组件进行分析,因为我对其他语言的编译没有研究。
根据编译原理,语言编译分为几个步骤:词法分析、语法分析、语义分析、中间语言生成、优化、目标代码生成等等。但从编译器使用的角度来看,将源代码翻译成可执行文件需要两个步骤,即编译和连接。相应地,一个完整的编译系统必须包括两个功能组件:编译器和连接器。编译器应该完成编译原则中提到的那些任务;连接器应该将编译器生成的代码片段拼接成一个完整的可执行程序。之所以需要连接器,是因为一般程序有多个源文件,编译器一次只编译一个源文件(称为翻译单元),所以需要连接器将所有翻译单元的对应输出合并成一个可执行文件。
如果一切顺利,可以正确生成可执行程序。但是一旦源代码出现问题,就会报错。编译器报告的错误一般都是局部错误,会指明错误在哪一行;连接器报告的错误一般都是全局错误,大多是多臂少腿的问题,比如函数重定义,外部符号未解析等。这些错误不能定位在某一行。
GCC是这里的编译器。准确的说,GCC是一个编译器驱动程序,它驱动cc1、as和ld完成编译、汇编和连接。Cc1将C源文件编译成汇编文件(。s)。将汇编代码转换成二进制指令的工作由AS完成,而熟悉的目标文件(。o)被生成。然后,这些生成的目标文件被打包到静态库(。a)通过AR程序,或者连接成可执行程序(elf,。so或其他格式)。而LD就是所谓的连接器。由于,AR和LD属于另一个叫binutils的软件包,所以为了让GCC有效工作,除了在系统中安装GCC之外,还要安装binutils。
下面是cc1,as和ld合作完成的一个编译过程。
[普通]查看普通副本
gcc测试c -S -o测试。S
作为测试。S -o测试
ld测试。o -o测试
常用的“gcc -c”相当于“gcc-S”+as,而编译单个源文件一步生成可执行文件“gcc test.c -o test”相当于上述三步的组合,中间文件放在临时目录中。从这个角度来说,gcc除了编译的功能之外,更像是一个驱动程序,可以驱动as和ld完成整个编译。特别是,GCC还接受目标文件(。o)和静态库(。a)作为生成可执行程序的参数,实际上在被调用LD的后面,也可以通过“-Wl,”选项将用户自定义的参数传递给LD。所以在大多数软件的Makefile中,你很难找到AS和LD这两个字,gcc已经给你安排好了。
GCC源代码主要包含cc1的部分(包括一些其他的辅助工具,比如collect2)。
二、GCC的安装
学习和修改GCC源代码,第一步是在自己的机器上用GCC源代码编译一个选定版本的GCC(以gcc-4.5.2.tar.bz2为例,源代码可以从http://gcc.gnu.org下载)。此外,GCC依赖于gmp、mpfr和mpc。如果你的机器上没有它们,或者版本太旧不支持新的GCC,你必须下载它们。
一般来说,下载gcc都是从GNU的FTP镜像网站。GCC的代码包一般放在/release/gcc-x.y目录下,而三个依赖库一般放在/infrastructure/目录下。
1.解包依赖库和GCC。
[普通]查看普通副本
tar-vjxf GMP-4 . 3 . 2 . tar . bz2-C/usr/src/
tar-vjxf mpfr-2 . 4 . 2 . tar . bz2-C/usr/src/
tar-vxf MPC-0 . 8 . 1 . tar . gz-C/usr/src/
tar-vjxf gcc-4 . 5 . 2 . tar . bz2-C/usr/src/
2.在您的主目录中编译依赖库。
[普通]查看普通副本
cd ~
mkdir GMP-制造
CD GMP-构建
/usr/src/GMP-4 . 3 . 2/configure-prefix =/usr/local/GMP-4 . 3 . 2 #指定安装位置。
制造
进行检查
进行安装
cd ~
mkdir mpfr-build
cd mpfr-build
/usr/src/mpfr-2 . 4 . 2/configure-prefix =/usr/local/mpfr-2 . 4 . 2-with-GMP =/usr/local/GMP-4 . 3 . 2
制造
进行检查
进行安装
cd ~
mkdir mpc-build
cd mpfr-build
/usr/src/MPC-0 . 8 . 1/configure-prefix =/usr/local/MPC-0 . 8 . 1-with-mpfr =/usr/local/mpfr-2 . 4 . 2-with-GMP =/usr/local/GMP-4 . 3 . 2
制造
进行检查
进行安装
3.编译GCC
[普通]查看普通副本
cd ~
mkdir gcc-构建
CD gcc-构建
/usr/src/gcc-4 . 5 . 2/configure-prefix =/usr/local/gcc-4 . 5 . 2-with-MPC =/usr/local/MPC-0 . 8 . 1-with-mpfr =/usr/local/mpfr-2 . 4 . 2-with-GMP =/usr/local/GMP-4 . 3 . 2-enable-languages = c,c++
制造
进行安装