GNU toolchain —— (一)介绍

本文介绍了GNU工具链的主要组成部分,包括GNUmake、GCC、GNU Binutils、GDB及GNU Autotools等,阐述了它们在软件开发过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GNU工具链(GNU toolchain)是一个包含了由GNU项目所产生的各种编程工具的集合。这些工具形成了一条工具链(串行使用的一组工具),用于开发应用程序和操作系统。 GNU工具链中包含的项目有:

1.  GNUmake

make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则),将源文件按照程序员的意愿组织和编译


 

2.  GCC

GCC,它并不只是一个C Compiler,GCC实际是GNU Compiler Collection的简称,可以支持C、C++、Object C、JAVA、Fortran、PASCAL等多种高级语言,主要包括如下工具:

    cpp:GNU预处理器(Preprocessor),主要用于扩展用户源程序的头文件和宏定义。GNU C Compiler在编译前自动使用cpp对用户程序进行转换。

    gcc:符合ISO等标准的C编译器
    g++:基本符合ISO标准的C++编译器

3.  GNU Binutils

其中GNU Binutils是一套用来构造和使用二进制所需的工具集。建立嵌入式交叉编译环境,Binutils工具包是必不可少的,而且BinutilsGNUC编译器gcc是紧密相集成的,没有Binutilsgcc也不能正常工作的。Binutils的官方下载地址是:ftp://ftp.gnu.org/gnu/binutils/,在这里可以下载到不同版本的Binutils工具包。

 

3.1  addr2line

将地址转换成文件名或行号对

 

3.2  ar

ar用于建立、修改、提取档案文件(archive)。archive是一个包含多个被包含文件的单一文件(也称之为库文件),其结构保证了可以从中检索并得到原始的被包含文件(称之为archive中的member)。member的原始文件内容、模式(权限)、时间戳、所有着和组等属性都被保存在 archive中。member被提取后,他们的属性被恢复到初始状态。

 

3.3  as

汇编器,gcc在汇编的时候会调用

 

3.4 gcov

用于查看代码的覆盖率

 

3.5 grpof

打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗时最多的函数。产生程序运行时候的函数调用关系,包括调用次数,可以帮助程序员分析程序的运行流程

 

3.6  ld

链接器,gcc在连接的时候调用

 

3.7  nm

列出ELF(目标文件、库或可执行文件)文件中的代码符号以及所对应的程序开始地址,如果没有指定文件则默认是a.out

 

3.8  objcopy

用来拷贝或是翻译目标文件,它可以把目标文件的内容从一种文件格式复制到另一种格式的目标文件中

 

3.9 objdump

帮助我们显示程序文件的相关信息,可以反编译二进制文件,也可以对对象文件进行反汇编,并查看机器代码。

 

3.10 ranlib

用于生成一个档案文件的内容索引。这样做的目的是为了加快档案文件的访问速度,比如,我们常对静态库文件(.a 文件)进行ranlib 以提高连接速度。


3.11 readelf

显示符号、段信息、二进制文件格式的信息等,这在分析编译器如何工从源代码创建二进制文件时非常有用

 

3.12 size

用于显示程序文件的段信息

 

3.13  strings

用于显示一个程序文件当中的可显示字符串

 

3.14  strip

用于剥去程序文件中的符号信息,以减小程序文件的大小。这对于存储空间有限的嵌入式系统尤为有用。

 

4.  GDB

著名的调式工具,估计大家都接触过

 

5. GNU autotools

 

这里只做一个概要介绍,在接下来的文章里将详细解述

 

 

参考  http://zh.wikipedia.org/zh/GNU_toolchain

 

 

 

### 关于 Keil5 中 TOOLS.INI 提示 TOOLCHAIN NOT INSTALLED 的问题 在讨论 `NULL` 的本质之前,先分析 Keil5 中关于工具链未安装的问题。此问题通常是因为配置文件 `TOOLS.INI` 缺失或者路径设置不正确所致[^3]。 #### 配置工具链的方法 要解决该问题,可以按照以下方法调整环境: 1. **确认工具链已正确安装** 确保已经下载并安装了对应版本的 ARM 工具链(如 MDK-ARM 或 GNU Arm Embedded Toolchain)。如果尚未安装,则需前往官方站点获取最新版本并完成安装过程[^4]。 2. **修改 TOOLS.INI 文件** 找到 Keil 安装目录下的 `TOOLS.INI` 文件位置,并打开编辑它。确保其中定义的路径指向实际存在的编译器可执行程序的位置。例如: ```ini [ARMC5] PATH=C:\Keil_v5\ARM\C Compiler\bin\ ``` 如果使用的是第三方 GCC 工具链,则应指定其 bin 路径,比如: ```ini [GCC] PATH=C:\Program Files (x86)\GNU Tools Arm Embedded\<version>\bin\ ``` 3. **重新启动 IDE 并验证项目构建状态** 修改完成后保存更改并关闭再重启 Keil5 应用程序,尝试重新加载工程以观察是否解决了 “TOOLCHAIN NOT INSTALLED” 错误消息。 --- ### 对 NULL 的进步解释 回到 C 语言中的 `NULL` 概念上来看,在标准头文件 `<stddef.h>` 和其他相关头文件里有如下宏定义形式之被采用: ```c #undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void*)0) #endif ``` 上述代码片段表明对于不同的编程范式有不同的处理方式——如果是 C++ 则简单地将其视为整数值零;而在纯 C 当中则通过强制转换成 `(void*)` 类型实现更严格的语义约束[^2]。 需要注意的是尽管如此操作看似合理但在某些特定场景下仍可能出现异常情况比如说当试图解引用个值为 null 的指针时就会触发段错误(segmentation fault),这是因为访问非法内存区域违反了操作系统保护机制的结果[^5]。 ```c #include <stdio.h> #include <stdlib.h> int main() { int* ptr = NULL; // Assigning a pointer to NULL. if(ptr == NULL){ printf("Pointer is pointing at address %p\n",ptr); } else{ *ptr=10; } } ``` 运行以上例子将会因为第二次分支内的指令企图向无效地址写入数据而崩溃结束进程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值