GNU 工具链与ARM 交叉编译工具链

发布于:2025-09-13 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、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 (反汇编分析文件)