【编译器】GCC源码分析(⼀)——介绍与安装
原⽂地址:blog.csdn/sonicling/article/details/6702031
上半年⼀直在做有关GCC和LD的项⽬,到现在还没做完。最近⼏天编程的那台电脑坏了,所以趁此间隙写⼀点相关的分析和经验之类的跟⼤家共享。
⼀、GCC的作⽤和运⾏机制
GCC是Linux下重要的编译⼯具,⽤法这⾥就不说了,满⼤街都得到。这⾥我重点介绍GCC的运作机制,作为代码分析的铺垫。全篇使⽤C语⾔⼦部件来作分析,因为我对其他语⾔的编译没有研究。
根据编译原理,语⾔的编译分为这么⼏个步骤:词法分析、语法分析、语义分析、中间语⾔⽣成、优化、⽬标代码⽣成等。然⽽从编译器使⽤的⾓度来看,要把源代码翻译为可执⾏⽂件要经过编译和连接两步,与此对应,⼀个完整的编译系统⼀定包含编译器和连接器两⼤功能部件。编译器要完成编译原理中提到的那些任务;连接器要把编译器⽣成的代码⽚段拼接成⼀个完整的可执⾏程序。之所以需要连接器,是因为⼀般的程序都是多源⽂件的,⽽编译器⼀次只编译⼀个源⽂件(称之为翻译单元translation unit),因此需要连接器把所有翻译单元对应的输出合并成⼀个可执⾏⽂件。
如果⼀切顺利,可执⾏程序就可以正确的⽣成出来。但是⼀旦源代码存在某些问题,错误就会被报告出来。
编译器报告的错误⼀般都是局部错误,它会指明错误在哪个⽂件第⼏⾏;连接器报告的错误⼀般都是全局错误,⽽且绝⼤多数都是多胳膊少腿的问题,⽐如函数重定义,⽆法解决的外部符号等,这些错误⽆法定位到某⼀⾏。
GCC就是这⾥的编译器。准确来说,GCC是⼀个编译驱动器,驱动cc1、as和ld三个部件完成编译、汇编和连接的⼯作。cc1将C语⾔源⽂件编译为汇编⽂件(.s)。⽽将汇编代码转换为⼆进制指令的⼯作由AS完成,⽣成⼤家都很熟悉的对象⽂件(.o);⽣成的这些对象⽂件再由AR程序打包成静态库(.a),或者由LD程序连接成可执⾏程序(elf、.so或其他格式)。⽽LD就是所谓的连接器。AS、AR、LD是属于另外⼀个叫做binutils 的软件包的程序,所以要让GCC能够有效运作起来,除了在系统中安装GCC外,还要安inutils才⾏。
以下是cc1、as、ld各司其责的配合完成⼀个编译过程。
[plain]
1. gcc test.c -S -o test.S
2. as test.S -o test.o
3. ld test.o -o test
通常所⽤的“gcc -c”就相当于“gcc -S” + as,⽽对于编译单个源⽂件⼀步到位⽣成可执⾏“gcc test.c -o test”相当于上⾯三个步骤的组合,中间⽂件被放置在临时⽬录下。从这⼀点看来,GCC除去编译的功能外,更像是个driver,它可以驱动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为例,源码可以从去下载)。除此之外,GCC依赖于gmp、mpfr、mpc三个库,如果你机器上没有,或者版本太⽼以⾄于⽆法⽀持新的GCC,那么你还得去把这三个库下载下来。
⼀般来说,下载GCC是从GNU的FTP镜像⽹站去下载,gcc的代码包⼀般放置在/release/gcc-x.y⽬录下,⽽那三个依赖库⼀般放置
在/infrastructure/⽬录下。
1、把依赖库和GCC解包
[plain]
1. tar -vjxf gmp-4.3.
2.tar.bz2 -C /usr/src/
2. tar -vjxf mpfr-2.4.2.tar.bz2 -C /usr/src/
3. tar -vxf mpc-0.8. -C /usr/src/
4. tar -vjxf gcc-4.
5.2.tar.bz2 -C /usr/src/
2、到⾃⼰的home⽬录下编译依赖库
[plain]
1. cd ~
2. mkdir gmp-build
3. cd gmp-build
4. /usr/src/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2 #指定安装位置
5. make
6. make check
7. make install
8.
9. cd ~
10. mkdir mpfr-build
11. cd mpfr-build
12. /usr/src/mpfr-2.4.2/configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
13. make
公司介绍源码14. make check
15. make install
16.
17.
18. cd ~
19. mkdir mpc-build
20. cd mpfr-build
21. /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
22. make
23. make check
24. make install
3、编译GCC
[plain]
1. cd ~
2. mkdir gcc-build
3. cd gcc-build
4. /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++
5. make
6. make install
漫长等待过后GCC就被安装到/usr/local/gcc-4.5.2⽬录下了,然后ln -s /usr/local/gcc-4.5.2/bin/gcc /usr/local/bin/gcc,最后gcc -v看看,版本号是不是换了?