arm-none-eabi-gcc 交叉工具链
一句话回答
arm-none-eabi-gcc 是 ARM 官方的裸机交叉工具链:在 PC 上编译出 Cortex-M 等 ARM MCU 跑的固件,一整套里除了编译器还有 objcopy/objdump/size(binutils)、arm-none-eabi-gdb 调试器和 newlib C 库;装好后用 -mcpu/-mthumb/-T 编出 ELF,再用 objcopy 转成可烧录的 bin/hex。
一、工具链包含什么
arm-none-eabi-gcc:编译器/链接驱动;arm-none-eabi-ld:链接器(通常通过 gcc 的-T调用);arm-none-eabi-objcopy:ELF → bin/hex 格式转换;arm-none-eabi-objdump:反汇编、看段;arm-none-eabi-size:统计 Flash/RAM 占用;arm-none-eabi-gdb:配合 JTAG/SWD 和 OpenOCD 调试;- newlib / libgcc:裸机 C 库和运行时支持。
二、安装
bash
# Ubuntu/Debian
sudo apt update
sudo apt install gcc-arm-none-eabi
# 验证
arm-none-eabi-gcc --versionWindows 可从 ARM Developer 下载 "Arm GNU Toolchain (bare-metal)" 安装包,安装时勾选把 bin 加入 PATH,重开终端后同样用 --version 验证。macOS 可用 brew install --cask gcc-arm-embedded。
三、编译一个 Cortex-M 固件
bash
arm-none-eabi-gcc \
-mcpu=cortex-m4 -mthumb \
-O2 -g -Wall \
-T linker.ld -nostartfiles \
startup/main.c src/main.c -o firmware.elf
# 转成可烧录文件
arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
arm-none-eabi-objcopy -O ihex firmware.elf firmware.hex
# 看 Flash/RAM 占用
arm-none-eabi-size firmware.elf
# 反汇编排查
arm-none-eabi-objdump -d firmware.elf | less常见坑
- PATH 未生效:装完没重开终端 / 没勾选加入 PATH,提示命令找不到。
-mcpu与芯片不符:用了目标核不支持的指令(如在 M0 上用 M4 指令)导致硬 fault。- 混用本机 gcc:用
gcc而非arm-none-eabi-gcc产出 x86 代码,无法烧录。 - 忘
-T/-nostartfiles:用默认主机布局或缺启动文件,镜像无法启动。 - objcopy/gdb 用了非交叉版本:格式/架构不匹配,务必用带前缀的同一套工具。
- 多版本冲突:系统包与手动安装的工具链版本不同时 ABI 可能不一致,固定用其中一套。
总结
arm-none-eabi-gcc 是编译 ARM 裸机固件的整套工具链(gcc + binutils + gdb + newlib),安装后用 -mcpu/-mthumb/-T 编译出 ELF,再用 objcopy 转 bin/hex、size 看占用、objdump 反汇编、gdb 配合 OpenOCD 调试;全程使用带前缀的同一套工具并保证 CPU 选项与芯片一致。