Zwlin's Blog

GNU_C

Last updated: 2018/10/23     Published at: 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 调试工具