objcopyコマンドでインテルHEXファイル(*.hex)をバイナリーファイル(*.bin)に変換する

目的

インテルHEXファイル(*.hex)をバイナリーファイル(*.bin)に変換することがあったのだが,少し困っていたので備忘録として記載する.
要件として必要なのは,以下の3点とする:

  1. 正常にバイナリーファイルに変換すること*1
  2. セクション間のギャップは0x00ではなく,0xFFで埋めること
  3. スキルが求められるような特殊な方法はできる限り使用しないこと
名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト
HEXファイル変換ツール HEXファイルツール Mario 社内でかつて使われていたツール
Linux OS Ubuntu,22.04.3 LTS Canonical 他のLinuxでもよい.cat /etc/os-releaseにて確認
変換コマンド objcopy,2.38 GNU objcopy --versionにて確認

結論

変換前のインテルHEXファイルをsource.hex,変換後のバイナリーファイルをsource.binとすると,以下のコマンドでsource.hexsource.binに変換できる:

objcopy --input-target=ihex --gap-fill 0xFF --output-target=binary source.hex source.bin

--gap-filオプションがない場合は,セクション間のギャップは0x00で埋まる.変換前のファイル,変換後のファイルの順番さえあっていれば,オプションの順序は問わない.
また,オプションはもちろん短縮形でもよく,同じ記載の場合

objcopy -I ihex --gap-fill 0xFF -O binary source.hex source.bin

となる.

その他

バイナリーファイルの生成について

今回の記事のきっかけは,HEW(High-performance Embedded Workshop)でのビルド生成物であるインテルHEXファイルをバイナリーファイルに変換したかったことによる.HEWのツールチェイン設定の最適化リンカタブのカテゴリ:出力の設定において、出力形式をHEX(ELF/DWARFアブソリュート付き)からバイナリ(ELF/DWARFアブソリュート付き)に変更することもできるのだが,こちらではセクション間のギャップが必ず0x00にしかできなかった.

HEXファイルツールについて

Windows10(64ビット),Windows7(32ビット)で起動すると,GUIが異常でそもそも使えない状態だった:

HEXファイルツール画面(Windows10にて起動)

また,Windows XP(32ビット)では正常なGUI表示となるが,インテルHEXファイルが大きいとバイナリーが途中から0x00になり,サイズが小さい異常なバイナリーファイルができなかった.

objcopyについて

できればLinuxまわりのインストールが必要なく進めたかったため,Git Bashで試してみたが,Git Bashにはobjcopyがデフォルトでは入っていなかった.
今回はWSL(Windows Subsystem for Linux)上のUbuntuで試してみて,こちらではデフォルトでobjcopyが実施できた*2

改訂履歴

# 日付 内容
1 2024/07/08 objcopyの短縮形のオプションの場合を追記

参考サイト

  1. binary - Converting from *.hex to *.bin for ARM on Linux - Stack Overflow(2024/07/06現在)
  2. Use objcopy --gap-fill only for special section - Stack Overflow(2024/07/06現在)

*1:当たり前だけど,HEXファイルツールにて問題があった.

*2:VirtualBox上のUbuntuでも実行できるはず.