编译文件
嵌入式开发里,Keil/IAR 编译完会生成一堆文件。四种最常见的:AXF、ELF、HEX、BIN。
AXF
AXF 是 ARM 工具链(Keil MDK 的 armlink)产出的可执行文件格式。本质上就是 ARM 魔改过的 ELF,文件结构完全一样:ELF Header + Program Header Table + Sections + Section Header Table。
与通用 ELF 的区别:
- 加了 ARM 特有调试信息:CoreSight 调试寄存器配置、
.ARM.attributessection(架构版本、FPU 是否开启等) - 可直接拖进 Keil Debug 仿真,GCC 的 ELF 需要额外转换
AXF 包含的内容
| 内容 | 说明 |
|---|---|
| 机器码 | 最终烧进 Flash 的指令(.text 段)。 |
| 数据段初值 | 全局变量、static 变量的初始值(.data、.rodata)。 |
| 符号表 | 函数、全局变量的地址信息,调试器靠它显示函数名和变量名。 |
| 调试信息 | 源代码行号映射、变量类型、作用域 → Keil Debug 单步跟踪。 |
| 段布局信息 | Flash/RAM 分配、入口点、栈和堆初始地址。 |
| ARM 特有属性 | 架构版本(ARMv6M/v7M/v8M)、FPU 是否开启。 |
AXF = HEX/BIN 的机器码 + 符号表 + 调试信息 + 内存布局。除代码外还加了全套元数据的综合文件。
ELF
ELF 是跨平台的通用可执行文件格式,GCC 工具链(ld)的标准产出。文件结构与 AXF 一致(ELF Header + Program Header Table + Sections + Section Header Table)。
与 AXF 的区别:
- 不含 ARM 特有调试扩展(
.ARM.attributes、CoreSight 配置) - 跨架构通用:x86、ARM、RISC-V 都用同一套格式
ARM 嵌入式语境下,“ELF” 一般指 GCC 编译出的
.elf。
HEX
Intel HEX 格式,ASCII 文本文件。每行是一条带地址和校验和的记录,告诉烧录器”把这段数据放到哪个地址”。
特点:
- 自带地址信息,可描述不连续的内存区域
- 烧录器/编程器通用格式,bootloader 常用
- 文件比 BIN 大约 2~3 倍(ASCII 编码 + 元数据开销)
BIN
纯二进制格式,只有机器码,没有任何元数据。文件最小、最原始。
特点:
- 无地址信息,按顺序烧录
- 文件大小即 Flash 占用大小
- 不含符号表、调试信息