windows交叉编译环境下如何使用单独的命令将elf文件转为hex文件?
一、背景
一般情况下,如果是本地编译,不会有这个需求,为什么?
1. Keil环境
keil的工程配置里面,直接勾选输出HEX文件就可以产生hex目标文件,重新编译就行。
2. gcc环境
比如vscode的EIDE插件使用了交叉gcc环境,编译时自动生成hex文件,没有这个需求。
那么只有一种情况需要单独转换,那就是别人(客户或第三方)发给你elf文件但是没有提供源码工程或sdk,你无法重新编译生成hex,此时就需要将别人编译好的elf单独转为hex了。
Q:
如果不知道别人用的什么编译环境,能直接转吗?
A:
可以,不管对方用的keil还是交叉gcc,elf文件本身是满足ELF(Executable and Linkable Format)规范的,和编译环境无关,都可以用下面提供的方法转换。
二、解决办法
2.1 elf 转hex
在windows命令行环境中,进入elf文件所在目录,然后输入如下指令:
arm-none-eabi-objcopy -O ihex target.elf target.hex
target.elf 为目标源文件,target.hex为目标输出文件。
2.2 elf 转bin
arm-none-eabi-objcopy -O binary target.elf target.bin
上述操作前提是需要安装arm-none-eabi-gcc交叉环境,如果无法识别指令则需要在系统变量中添加对应目录。比如我的交叉gcc安装目录为:
C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin
就把这个添加到Path系统环境变量即可。
命令行检查是否能识别到gcc或objcopy命令:
arm-none-eabi-gcc -v
响应正常。
arm-none-eabi-objcopy -v
响应正常。
关于hex和bin的互转
上面已经得到hex文件或bin文件,要互转可以通过第三方工具H-Converter来实现。软件为绿色开源可以自行搜索下载。也可以通过上述指令单独得到对应格式,不过日常操作有H-Converter还是比较方便。