一 GCC编译过程涉及到的指令
gcc指令 | 单独指令 | 备注 | |
预处理 | gcc -E hello.c -o hello.i | cpp hello.c > hello.i | 完成C语言源文件上的文件包含和宏置换 |
编译 | gcc -S hello.i -o hello.s或 gcc -S hello.c -o hello.s | ccl hello.c | 编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析及优化后生成相应的汇编代码部分。 |
汇编 | gcc -c hello.s -o hello.o或 gcc -c hello.c -o hello.o | as hello.s -o hello.o | 汇编器将汇编代码转变成机器可执行的指令 |
链接 | gcc hello.c(默认链接) gcc test.c -L. -ltest -o main(动态库) gcc main.c -lhello -L. -static -o main (静态库) | a.c引用b.c的函数 gcc -c a.c b.c ld a.o b.o -e main -o ab -e main表示将main函数 作为程序入口 | 完成对目标文件的链接 |
二 GCC相关
对于C语言,预编译和编译的程序是ccl;对于C++,对应的程序时cclplus;Objective-C是cclobj;fortran是f771;Java是jcl。所以gcc命令只是这些后台程序的包装,它会根据不同的参数要求去调用预编译及编译程序ccl、汇编器as、链接器ld。
(1)gcc安装的各个部分:
g++:c++编译器,链接时使用c++库 | |
gcc | c编译器,链接时使用c库 |
cc1 | 实际的c编译器 |
cc1plus | 实际的c++编译器 |
collect2 | 使用collect2产生特定的全局初始化代码,后台处理是传递参数给ld完成实际的链接工作 |
crt0.o | 初始化和结束代码 |
libgcc | 平台相关的库 |
gcc安装需要的文件:
gcc-core-3.4.6.tar.gz2 | gcc核心编译器,默认只包含c编译器 |
gcc-g++-3.4.6.tar.bz2 | g++编译器 |
gcc-testsuite-3.4.6.tar.bz2 | 测试套件 |
./configure && make && make install |
(2)binutils安装的各个部分
as | gnu汇编工具 |
gprof | 性能分析工具 |
ld | gnu链接器 |
make | gnu的一款工程化编译工具,主要能够编译有较多关联关系的源代码文件,从而实现工程化的管理并提高效率 |
objcopy | 目标文件从二进制格式翻译或复制到另一种 |
objdump | 显示目标文件的各种信息 |
strings | 显示文件的字符串 |
strip | 去除符号表 |
readelf | 分析elf并显示信息 |
链接器可以读写各种目标文件中的信息,通过BFD(binary file descriptor)提供的工具实现,BFD定义了类似a.out, elf, coff等目标文件的格式。