Zwlin's Blog

GNU_C

2018/10/23

搬运自我的Linux0.11仓库

GNU 编译工具链

简介

GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。

原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC在发布后很快地得到扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,Go与其他语言。

许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。苹果计算机预装的Mac OS X操作系统也采用这个编译器。

编译和链接

假设使用Linux命令行编译以下代码

1gcc -Og -o prog prog1.c prog2.c
2# -Og表示不进行优化,优化等级高导致机器代码和原始代码严重变形,不易分析
3# -o表示命名

实际上gcc调用了一整套的程序,将源代码转化成可执行代码。首先,C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。其次编译器将产生两个源文件的汇编代码,名字分别为prog1.sprog2.s。接下来,汇编器会将汇编代码转换成二进制目标代码文件prog1.oprog2.o。目标代码是机器代码的一种形式,但还没有填入全局的地址。最后,链接器将两个目标代码文件和实现库函数(例如printf)的代码合并,并产生最终的可执行文件prog。可执行代码是我们要考虑的机器代码的第二种形式,也就是处理器执行的代码格式。更详细的信息可以参考CSAPP第七章。

有关命令

1gcc
2ld
3objdump
4objcopy
5dd
6# 使用方法Google

GDB 调试工具