なぜ HEX を ELF に変換するのですか?
一部の組み込みツールチェーンやデバッガは、生のHEXではなくELF入力のみを受け付けます。.hexを .elf にラップすることで、シンボルテーブルがなくても、GDBやELF形式を必要とする書き込みユーティリティにファームウェアをロードできるようになります。シンボルとデバッグ情報を含む完全なELFはコンパイラによって生成されます。HEXからの変換では、ストリップされた(情報の削られた)シェルのみが得られます。
HEX から ELF への変換方法
avr-objcopy OPEN-SOURCE
avr-objcopy -I ihex -O elf32-avr firmware.hex firmware.elfを実行します。elf32-avrを正しいターゲット(例:ARM Cortex-Mの場合はelf32-littlearm)に置き換えてください。avr-objcopyはavr-gccに付属しており、Arduino IDE内にも同梱されています。
arm-none-eabi-objcopy OPEN-SOURCE
ARM Cortex-Mターゲットの場合、GNU Arm Embedded Toolchainからarm-none-eabi-objcopy -I ihex -O elf32-littlearm firmware.hex firmware.elfを実行します。
これらの形式について
.hexファイルはIntel HEXファイルです。Arduino、AVR、PICチップなどのマイコン用にコンパイルされたファームウェアが、プレーンテキストのレコードとして保存されています。PC上で実行するものではなく、Arduino…
.HEX の詳細を開く →ELF ファイルは、Linux、Android、BSD、およびほとんどの Unix 系システムで使用されるバイナリ実行形式であり、Windows の EXE に相当します。Linux では直接実行します。PS2 自作ソフトの .elf は PCSX2 で、GameCube/Wii の .elf は Dolphin で動作します。ELF は Windows や macOS…
.ELF の詳細を開く →品質と注意点
- 出力されるELFには、ターゲットアドレスにある生のバイトのみが含まれます。セクション名は、コンパイラによって割り当てられた元の
.text、.data、.bssではなく、汎用的な名前(例:.sec1)になります。 - ファームウェアを自分でコンパイルした場合は、ビルドディレクトリに
.hexと並んで.elfがすでに存在している可能性が高いので、変換前に確認してください。 -O elf32-avrアーキテクチャフラグは実際のCPUと一致している必要があります。間違ったフラグを使用すると、デバッガやフラッシャーが拒否するELFが生成されます。
よくある質問
HEXファイルから関数名やデバッグシンボルを復元できますか?
自分のマシン上のどこにavr-objcopyがありますか?
hardware/tools/avr/bin/の下に同梱されています。ARMターゲットの場合はarm-none-eabi-objcopyを使用してください。