elf、axf、bin的区别与转换
一、核心区别总结
特性 | ELF (Executable and Linkable Format) | AXF (ARM eXecutable Format) | BIN (Binary Image) |
---|---|---|---|
本质 | 通用标准格式 (Linux/Unix) | ARM专用ELF变种 | 纯二进制数据 |
内容 | 代码+数据+符号表+调试信息+重定位信息 | ELF+ARM特定调试信息 | 仅机器码和初始化数据 |
文件大小 | 较大 | 最大(含丰富调试信息) | 最小 |
主要用途 | 链接/调试/动态链接 | ARM平台调试(Keil/IAR) | 直接烧录/执行 |
可调试性 | 支持符号级调试 | 支持高级源码调试 | 不可调试 |
平台依赖 | 跨平台 | ARM专用 | 与内存布局强相关 |
二、格式详解
1. ELF 文件
结构:
ELF Header Program Header Table (加载视图) Section Header Table (链接视图) .text (代码段) .data (初始化数据) .rodata (只读数据) .bss (未初始化数据,不占文件空间) .symtab (符号表) .debug (调试信息) ...其他段
特点:
包含完整的链接和调试信息
支持动态链接库
GCC工具链默认输出格式
2. AXF 文件
本质:ARM工具链(Keil MDK/IAR)对ELF的扩展
特有内容:
ARM CoreSight™ 调试信息
Flash下载算法描述
设备内存映射配置
典型应用:
Keil uVision调试
J-Link/ULinkPro等ARM调试器
3. BIN 文件
结构:纯二进制序列
[0x0000] 机器指令1 [0x0004] 机器指令2 ... [0x1000] 初始化数据
特点:
无地址信息(需指定加载基址)
无符号/调试信息
直接对应内存映像
三、转换方法与工具
1. ELF → BIN(常用)
# GCC工具链
arm-none-eabi-objcopy -O binary input.elf output.bin# ARMCC工具链(Keil)
fromelf --bin --output=output.bin input.axf
2. AXF → BIN
# Keil环境
fromelf --bin -o output.bin input.axf# 或先转ELF再转BIN
fromelf --elf -o temp.elf input.axf
arm-none-eabi-objcopy -O binary temp.elf output.bin
3. BIN → ELF(逆向转换)
# 需指定基址和架构
arm-none-eabi-objcopy -I binary -O elf32-littlearm \-B armv7e-m --set-section-flags .data=alloc,load,code \--rename-section .data=.text \input.bin output.elf
4. ELF ↔ AXF
# AXF本质是ELF的扩展,可直接重命名(不推荐)
cp input.axf output.elf# 完整转换需重新链接(Keil工程设置Output Format)
四、转换关系图
五、关键注意事项
地址一致性:
BIN文件无地址信息,加载时必须指定基址(需与链接脚本一致)
/* 链接脚本必须指定基址 */ MEMORY { ROM (rx) : ORIGIN = 0x08000000, LENGTH = 128K }
调试信息保留:
# 保留调试信息的ELF(不推荐用于生产) arm-none-eabi-objcopy --only-keep-debug input.elf debug.sym
BIN文件填充:
使用填充确保段对齐(如Flash擦除块大小)
arm-none-eabi-objcopy -O binary --pad-to 0x10000 input.elf padded.bin
校验和添加:
# 在BIN文件末尾添加CRC32校验 srec_cat output.bin -binary -crop 0 0xFFFF -fill 0xFF 0x0000 0x10000 \ -crc32-l-e 0x10000 -o final.bin
六、典型应用场景
文件格式 | 使用场景 | 工具链支持 |
---|---|---|
ELF | Linux应用、U-Boot、高级调试 | GCC, Clang |
AXF | Keil/IAR工程调试、JTAG下载 | ARMCC, IAR |
BIN | Bootloader加载、Flash烧录、量产 | 所有工具链 |
经验提示:开发阶段使用ELF/AXF调试,发布时转换为BIN进行烧录。使用
arm-none-eabi-readelf -a file.elf
可分析ELF结构。