GNU 工具链与ARM 交叉编译工具链
一、GNU 工具链常用工具
GNU 工具链(GNU Toolchain)是由 GNU 项目提供的一套跨平台、功能完善的软件开发工具,主要应用于操作系统开发、嵌入式系统开发以及应用软件开发。它包含了从源代码编译到目标程序生成、再到调试和分析的完整流程
(一)gcc
名称:gcc (GNU Compiler Collection)
功能:编译器 (Compiler)
将 C/C++ 等高级语言源代码转换为汇编代码
再将汇编代码转换为目标文件
支持多种编程语言和目标平台(如 C、C++、Fortran、Ada 等)
提供丰富的优化选项和编译控制选项(如 -O1
、-O2
、-O3
、-Os
)
常用选项:
-c
:只编译不链接,生成 .o
文件
-o
:指定输出文件名
-Wall
:开启常见警告信息
-g
:生成调试信息
(二)ld
名称:ld (GNU Linker)
功能:链接器 (Linker)
将多个目标文件(.o 文件)链接成可执行文件
解析和处理符号引用(变量、函数等)
进行地址分配和重定位
处理库文件的链接(静态库 .a
,动态库 .so
)
支持链接脚本(Linker Script),便于嵌入式开发中指定内存布局
(三)objcopy
名称:objcopy (Binary File Converter)
功能:目标文件格式转换器
在不同格式的目标文件之间进行转换(如 ELF → binary)
将 ELF 格式转换为纯二进制格式 .bin
(常用于烧录固件)
从目标文件中提取特定的段 (sections),如 .text
、.data
修改目标文件的内容(如去除调试信息)
常用命令:
objcopy -O binary input.elf output.bin
objcopy -j .text -j .data input.elf output.elf
(仅保留特定段)
(四)objdump
名称:objdump (Object File Disassembler)
功能:目标文件分析器 / 反汇编器
将机器码反汇编为汇编代码
查看目标文件的详细信息(段信息、符号表、头信息等)
分析程序的执行指令,便于调试与优化
显示各种文件格式信息(如 ELF 头、重定位信息
(五)as
名称:as (GNU Assembler)
功能:汇编器 (Assembler)
将汇编代码转换为目标文件 .o
支持多种 CPU 架构(x86, ARM, MIPS 等)
与 gcc、ld 配合使用,完成从汇编到可执行程序的流程
(六)gdb
名称:gdb (GNU Debugger)
功能:调试器 (Debugger)
支持调试 C/C++、汇编等程序
可以单步执行、断点调试、变量监视、堆栈跟踪
支持远程调试(常用于嵌入式开发,gdbserver
配合使用)
常用命令:
break
:设置断点
run
:运行程序
next
/ step
:单步执行
print var
:查看变量值
info registers
:查看寄存器状态
(七)nm
名称:nm (Symbol Table Dumper)
功能:符号表查看器
列出目标文件或可执行文件中的符号表
可查看函数、全局变量在文件中的地址及类型
常用于排查链接错误或分析符号依赖
常用命令:
nm file.o
nm -g file.o
(仅显示全局符号)
二、ARM 交叉编译工具链示例
1. 编译汇编源码,生成目标文件
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
-g
:生成调试信息
-c
:只编译不链接,生成 led.o
2. 链接目标文件,生成 ELF 可执行文件
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
-Ttext 0x87800000
:指定程序的装载地址(常用于裸机程序)
输出 led.elf
,包含调试信息和符号表
3. 转换为裸机可执行的二进制文件
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
-O binary
:输出二进制格式
-S -g
:去除调试信息
输出 led.bin
,可直接烧录到 Flash/SDRAM
4. 反汇编 ELF 文件,生成可读性更好的指令文件
arm-linux-gnueabihf-objdump -D led.elf > led.dis
-D
:反汇编所有段
输出 led.dis
,方便阅读与调试
ARM 交叉编译完整流程图:
led.s (汇编源码)│├── gcc/as → led.o (目标文件)│├── ld (指定装载地址) → led.elf (ELF 可执行文件)│├── objcopy → led.bin (纯二进制文件,烧录用)│└── objdump → led.dis (反汇编分析文件)