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的编译过程:

  1. 预处理(Preprocessing)

    预处理器主要进行宏替换条件编译头文件展开注释去除等操作。

    预处理阶段的输出是纯文本文件,扩展名为 .i

  2. 编译(Compilation)

    编译器主要进行语法分析语义分析编译优化等操作。

    编译阶段的输出是汇编语言文件,扩展名为 .s

  3. 汇编(Assembly

    汇编器将汇编代码转换为机器代码、并生成符号表

    汇编阶段的输出是目标文件,通常扩展名为 .o.obj

  4. 链接(Linking)

    链接器主要进行符号解析地址和数据重定位静态库/动态库链接等操作

    链接阶段的输出是可执行文件或库文件。