基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法


  • 已经弃用的版本(Version 10.3-2021.10):gcc-arm-none-eabi:https://developer.arm.com/downloads/-/gnu-rm
  • Arm GNU Toolchain当前版本:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

✨如果是基于MDK Keil ARMCC编译器,可以借助自带的fromelf.exe 进行转换,如果使用arm GNU Toolchain工具链编译所生成的.elf文件,不要使用fromelf.exe 进行转换,两者不要混用。否则转换后的文件烧录后可能不能正常运行。

📗通过arm GNU Toolchain编译后手动生成的.elf格式文件转换

在命令行中手动运行以下命令,确保 arm-none-eabi-objcopy.exe 可以正常工作:

  • 手动转换命令:
c 复制代码
"D:\arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe" -O ihex "D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.elf" "D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.hex"
  • 为了实现快速转换,可以制作一个.bat批处理文件,双击批处理文件,实现方便快捷转换。
  • convert_elf_to_hex_bin.bat文件内容:
c 复制代码
@echo off
echo Converting .elf to .hex and .bin...

REM 定义工具路径和输入输出文件路径
set OBJCOPY="D:\arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe"
set ELF_FILE="D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.elf"
set HEX_FILE="D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.hex"
set BIN_FILE="D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.bin"

REM 转换为 .hex 文件
%OBJCOPY% -O ihex %ELF_FILE% %HEX_FILE%
if %errorlevel% equ 0 (
    echo .hex file created successfully.
) else (
    echo Failed to create .hex file.
    exit /b 1
)

REM 转换为 .bin 文件
%OBJCOPY% -O binary %ELF_FILE% %BIN_FILE%
if %errorlevel% equ 0 (
    echo .bin file created successfully.
) else (
    echo Failed to create .bin file.
    exit /b 1
)

echo Conversion completed.
pause

📗通过arm GNU Toolchain编译后自动生成的.elf格式文件转换

  • 在Windows平台下,通过cmakelist.txt文件,使用cmake构建文件,通过make/ninja生成的.elf格式文件,.elf格式文件本身是可以支持DAP-LINK、jlink配合相对应的配置文件是可以在线烧录的。有些时候需要其他方式烧录,例如串口、做IAP升级使用时,则需要hex或者bin文件。
  • 需要提前在 CMakeLists.txt文件中添加编译后的文件转换脚本:
c 复制代码
# 定义生成的文件路径
set(ELF_FILE ${TARGET_NAME}.elf)
set(HEX_FILE ${TARGET_NAME}.hex)


# 定义生成的 ELF 文件路径
set(ELF_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.elf)

# 定义生成的 HEX 文件路径
set(HEX_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.hex)

# 定义 objcopy.exe 路径
set(OBJCOPY_PATH "D:/arm-gnu-toolchain/bin/arm-none-eabi-objcopy.exe")

# 定义生成的 ELF 文件路径
set(ELF_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.elf)

# 定义生成的 HEX 文件路径
set(HEX_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.hex)
set(BIN_FILE ${TARGET_NAME}.bin)

# 添加自定义命令,在编译完成后自动生成 HEX 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
    COMMAND ${OBJCOPY_PATH} -O ihex ${ELF_FILE} ${HEX_FILE}
    COMMENT "Converting ELF to HEX"
    VERBATIM
)

# 添加自定义命令,在编译完成后自动生成 BIN 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
    COMMAND ${OBJCOPY_PATH} -O binary ${ELF_FILE} ${BIN_FILE}
    COMMENT "Converting ELF to BIN"
    VERBATIM
)
  • 其中arm-none-eabi-objcopy.exe文件在arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe

📘MDK keil工程中hex/bin文件转换方法

方法一:使用Keil软件内置功能

1.打开Keil软件,选择菜单栏中的"File"。

2.选择"Convert HEX to BINARY"选项。

3.在弹出的窗口中选择要转换的HEX文件,并指定转换后的BIN文件的保存路径。

4.点击"Convert"按钮,完成转换后,可以在指定的保存路径找到生成的BIN文件。

方法二:使用fromelf工具

c 复制代码
fromelf --bin -o "output_file.bin" "input_file.hex"

其中,--bin选项指示程序输出二进制格式的数据,-o后面跟随的是期望保存结果的位置和文件名,最后是待处理源文件的具体路径与名称。

自动化处理

为了在编译过程中自动生成BIN文件,可以在Keil的项目设置中进行配置:

1.进入"Options for Target"的设置界面。

2.在User标签页中勾选Run#2,并按照模板填写如下指令字符串:

c 复制代码
fromelf.exe --bin -o ./release.bin !L

每当成功编译完成后,就会依据设定好的规则在指定位置生成对应的BIN文件。

相关推荐
赌博羊8 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
lGSrsEpqUxi4 小时前
聊聊独特的母线电流估算算法模型
gnu
勾股导航4 小时前
Windows安装GPU环境
人工智能·windows·gnu
dingdingfish7 天前
GNU Parallel 学习 - 第1章:How to read this book
bash·shell·gnu·parallel
dingdingfish7 天前
GNU Parallel 学习笔记 - 总目录
bash·gnu·parallel
EleganceJiaBao7 天前
【嵌入式】GNU/GCC vs LLVM/Clang
gnu·clang·gcc·llvm
切糕师学AI8 天前
ARM汇编器与GNU汇编器:详细介绍与核心区别
arm开发·gnu·汇编器
心态还需努力呀9 天前
【鸿蒙PC命令行适配】GNU Hello 库在鸿蒙 PC 上的交叉编译与移植部署实战
华为·鸿蒙·gnu·openharmony·开源鸿蒙
加强洁西卡9 天前
【RISC-V】riscv64-linux-gnu工具链都有哪些工具
linux·gnu·risc-v
盛邦安全12 天前
漏洞预警 | GNU InetUtils telnetd 远程认证绕过漏洞(CVE-2026-24061)
服务器·gnu