GNU简介
GNU(GNU’s Not Unix!)是一个由理查德·斯托曼(Richard Stallman)于1983年发起的自由软件项目,旨在创建一个与Unix兼容的操作系统,但完全不含任何Unix代码。GNU项目的目标是开发一个完整的操作系统,但最初缺乏一个可用的内核。直到1991年林纳斯·托瓦兹(Linus Torvalds)发布了Linux内核,并与GNU组件结合,才形成了我们今天所熟知的GNU/Linux操作系统。
GNU项目包含了一系列软件应用程序、系统库、开发工具等。这些组件共同构成了GNU操作系统的基石。以下是一些重要的GNU组件:
-
GNU Compiler Collection (GCC):GNU编译器集合,是一套由GNU开发的编程语言编译器(C、C++等)以及这些语言的库(libstdc、libstdc++等)。
-
GNU C Library (glibc):GNU的C库,是GNU系统中最基本的C语言库。为GNU系统提供了标准的C库函数。
-
GNU Binutils:GNU二进制工具集,包含了一系列用于产生和控制Linux中的二进制应用程序代码的工具。这些工具包括:
- ld :GNU链接器
- gold: 一个新的,更快的,ELF专用链接器
- as :GNU汇编器
- ar:可以对静态库做创建、修改和提取的操作。
- nm:显示目标文件内的符号信息。
- objdump:显示目标文件的相关信息。
- readelf: 显示ELF文件的内容。
- strip:从目标文件中移除符号信息。
-
gprof:性能分析(profiling)工具程序。
- addr2line:从目标文件的虚拟地址获取文件的行号或符号。
- c++filt:反编译(反混淆,demangle)C++符号的工具。
- size:列出目标文件或库文件的section大小。
- strings:列出文件中可打印的字符串信息。
- objcopy:复制和转译目标文件。
-
GNU Debugger (GDB):GNU调试器,一款程序调试工具。允许开发人员对程序进行断点、单步执行、查看变量值等操作。
GCC
GCC的编译过程:
-
预处理(Preprocessing)
预处理器主要进行宏替换、条件编译、头文件展开、注释去除等操作。
预处理阶段的输出是纯文本文件,扩展名为
.i
。 -
编译(Compilation)
编译器主要进行语法分析、语义分析、编译优化等操作。
编译阶段的输出是汇编语言文件,扩展名为
.s
。 -
汇编(Assembly)
汇编器将汇编代码转换为机器代码、并生成符号表。
汇编阶段的输出是目标文件,通常扩展名为
.o
、.obj
。 -
链接(Linking)
链接器主要进行符号解析、地址和数据重定位、静态库/动态库链接等操作
链接阶段的输出是可执行文件或库文件。