GNU 是什么?

转自:维基百科

GNU 一种自由软件计划

        GNU计划,有译为“革奴计划”,是由理查德·斯托曼在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。理查德·斯托曼最早是在net.unix-wizards新闻组上公布该消息,并附带一份《GNU宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。
         GNU是“GNU's Not Unix”的递归缩写,为避免与gnu(非洲牛羚,发音与“new”相同)这个单词混淆,斯托曼宣布GNU应当发音为“Guh-NOO”(/ˈgnuː/ (帮助·关于)),与“canoe”发音相似。
        UNIX是一种广泛使用的商业操作系统的名称。由于GNU将要实现UNIX系统的接口标准,因此GNU计划可以分别开发不同的操作系统。GNU计划采用了部分当时已经可自由使用的软件,例如TeX排版系统和X Window视窗系统等。不过GNU计划也开发了大批其他的自由软件,这些软件也被移植到其他操作系统平台上,例如Microsoft Windows、BSD家族、Solaris及MacOS。

        为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都包含一份在禁止其他人添加任何限制的情况下,授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。这个就是被称为‘公共版权’的概念。GNU也针对不同场合,提供GNU宽通用公共许可证(与GNU自由文档许可证这两种协议条款。

     到了1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs。GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器。以及大部分UNIX系统的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD)。
  1991年Linus Torvalds编写出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。Linux之后在网上  Linux内核的缔造者Linus Torvalds广泛流传,许多程序员参与了开发与修改。1992年Linux与其他GNU软件结合,完全自由的操作系统正式诞生。该操作系统往往被称为“GNU/Linux”或简称Linux。(尽管如此GNU计划自己的内核Hurd依然在开发中,目前已经发布Beta版本。)
  许多UNIX系统上也安装了GNU软件,因为GNU软件的质量比之前UNIX的软件还要好。GNU工具还被广泛地移植到Windows和Mac OS上。

### GNU 的定义与背景 GNU 是一个由自由软件基金会(FSF)发起的项目,其全称是 **GNU's Not Unix**,这是一个递归缩写。GNU 项目的初衷是创建一个完全自由的操作系统,类似于 Unix,但不包含任何 Unix 的代码[^1]。GNU 提供了一套完整的工具和库,用于支持操作系统开发和应用程序构建。 #### GNU 工具链的核心组件 GNU 工具链是一组用于软件开发的工具集合,包括以下关键部分: 1. **编译器Compiler)**:GCC(GNU Compiler Collection),支持多种编程语言的编译工作。 2. **汇编器(Assembler)**:GAS(GNU Assembler),将汇编语言代码转换为机器码。 3. **链接器(Linker)**:LD(GNU Linker),负责将多个目标文件合并为最终可执行文件或库文件。 4. **标准库(Standard Library)**:glibc(GNU C Library),提供实现 C 语言标准库功能的函数集合[^2]。 #### GNU 工具链的作用 GNU 工具链在软件开发中扮演了重要角色,它不仅提供了从源代码到可执行文件的完整流程支持,还确保了开发环境的跨平台性和兼容性。例如,在嵌入式开发中,开发者可以使用 GCC 编译器为目标硬件生成优化的二进制代码,同时利用 LD 链接器进行符号解析和地址分配[^3]。 #### 符号的概念及应用 在 GNU 工具链中,符号是一个重要的概念。符号通常指代程序中的变量、函数或标号等实体。在汇编语言中,`label:` 表示一个标号,用于标记特定的内存地址位置。例如,以下代码片段展示了如何定义一个标号并使用注释: ```assembly start: mov r0, #1 @ 初始化寄存器 r0 add r0, r0, #2 @ 将 r0 加上 2 ``` 上述代码中,`start:` 是一个标号,表示该位置的内存地址,而 `@` 后的内容为注释[^4]。 #### 链接器脚本中的符号 在 LD 链接器脚本中,符号被用来定义段的起始地址、大小以及其他属性。例如,以下是一个简单的链接器脚本示例,其中定义了 `.text` 段的起始地址: ```ld SECTIONS { .text : { *(.text) } > FLASH } ``` 此脚本将所有 `.text` 段的内容放置在名为 `FLASH` 的存储区域中,并通过符号机制确保正确的地址分配[^5]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值