基于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文件。

相关推荐
WIFI_BT_DEV24 天前
Linux设备驱动开发-UART驱动
linux·arm开发·驱动开发·嵌入式硬件·硬件架构·信息与通信·gnu
WIFI_BT_DEV25 天前
Linux设备驱动开发-中断
linux·c语言·arm开发·驱动开发·嵌入式硬件·硬件架构·gnu
wzhao1011 个月前
elf_loader:一个使用Rust编写的ELF加载器
linux·rust·gnu
Once_day2 个月前
GCC之编译(8)AR打包命令
ar·gnu·gcc
乔宕一2 个月前
在 vscode + cmake + GNU 工具链的基础上配置 JLINK
vscode·gnu·jlink
LIKEYYLL3 个月前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu
凛冬将至__4 个月前
【GNU】gcc -g编译选项 -g0 -g1 -g2 -g3 -gdwarf
linux·gnu·gcc
凛冬将至__4 个月前
【GNU】反汇编工具objdump
linux·服务器·gnu·objdump
一丝晨光4 个月前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++