概要:
fromelfが生成した複数のバイナリイメージを結合する必要がある場合があります。
例えば、scatterファイルにおいて複数のロードリージョンを指定した場合に各ロードリージョンごとに生成されたバイナリを一括して単一のROMに焼き付けたい場合などです。 また、そのほかにもバイナリプログラムコード(fromelfの-binオプションを指定して生成した)とバイナリデータファイル(サードパーティのフォントデータなど)を1つのバイナリイメージ(ROM化可能な)にする必要がある場合などもあります。
これを行うのに6つの方法が考えられます:
1. デバッガを利用してイメージを結合する
事前に各イメージを配置する絶対アドレスがわかっている場合、armsdやADW、ADUではgetfile/putfile、AXDではloadbinary/savebinary、RVDではreadfile/writefileの機能を利用して簡単にマージを行うことができます。 AXD上でimage_a.binとimage_b.binを結合する例:
- File->Load Memofy from File...を選択して、image_a.binを例えば0x0の様にアドレスを指定してロードします。
- image_b.binを、A.でimage_a.binをロードした領域と重ならない様にアドレスを指定してロードします。
- i.とii.でロードしたイメージの両方を含むアドレス範囲をバイナリイメージでファイルに保存します。 File→Save Memory to Fileを選択し、AddressをA.で指定したアドレスに、Lengthをimage_b.binのロードされた最終アドレスまでとして任意のファイル名を指定して、保存を行います。
これにより、2つのイメージを結合したファイルが生成されます。 この方法は単にイメージを一括化するだけで、リンカがおこなうようなインテリジェンスを持った配置がおこなわれないことに注意してください。
2. binファイルを生成するのにデバッガを使用する
上記の方法同様に、複数のロードリージョンからなるフルELFイメージをデバッガからロードして、単一のバイナリイメージを生成することもできます。 AXD上でimage.axfからバイナリイメージを生成する例:
- File->Load Imageを選択して、image.axfをロードします。
- i.でロードしたイメージの全体を含むアドレス範囲をバイナリイメージでファイルに保存します。
File→Save Memory to Fileを選択し、AddressをA.をロードした先頭アドレスに、Lengthをimage.axfのロードされた最終アドレスまでとして任意のファイル名を指定して、保存を行います。
これにより、すべてのロードリージョンを含むバイナリファイルが生成されます。 事前にロードされたイメージの最終アドレスを知らない場合、これを自動的に知ることができます。
armsdを用いてELFファイル(バイナリイメージを含む)をロードした場合、これはバイナリの情報だけでなくデバッグ情報もロードされます。 それによって、低レベルscatter-loadingシンボル名に直接アクセスすることができます。 その為、最終のロードリージョンが、単一の実行リージョンのLASTを含んでいた場合(再配置がおこなわれない形で)、複数のバイナリを一つのファイルに保存することができます:putfile image.bin 0x0,(Image$$LAST$$Base+Image$$LAST$$Length)
もし、上記の例のように0番地をベースとしていない場合、最初のロードリージョンの最初の実行リージョンのFIRSTが示す箇所をImage$$FIRST$$Baseのシンボルでも定義可能です。ADSv1.1以降では、リンカはこれらのシンボルをソースコード内で参照されたときだけ生成します。 この場合、以下の様に適切なシンボルに対する参照をおこなうダミーコード領域を作成する必要があります。
AREA Dummy, CODE IMPORT |Image$$FIRST$$Base| IMPORT |Image$$LAST$$Base| IMPORT |Image$$LAST$$Length| END
このコードを単純にアセンブルして、そのオブジェクトをプロジェクトにリンクしてください。
3. DOSの'copy'またはUNIXの'cat'を使用する
DOSおよびUNIXでバイナリを生成するために次の方法を用います:
(DOS) copy /b app.bin+data.bin romimage (Unix) cat app.bin data.bin > romimage
これにより、2つ以上のcode/dataファイルを結合したイメージが生成できます。 この方法は単にイメージを一括化するだけで、リンカがおこなうようなインテリジェンスを持った配置がおこなわれないことに注意してください。
4. BIN2AOFをビルド時に使用する
もう一つのアプローチがバイナリデータをAOFオブジェクトに変換し、これをarmlinkでインテリジェンスを持ってリンクすることができます。 AOFへのバイナリからの変換はBIN2AOFと呼ばれるユーティリティで行われます。 リンカは、最終的な結合イメージを生成するために、コンバートされたAOFオブジェクトと他のcode/dataを含むオブジェクトファイル(コンパイラやアセンブラで生成された)をリンクすることができます。 このアプローチはscatter-loadingを使ったプロジェクトでも使用することができます。
BIN2AOFユーティリティはフリーダウンロード可能ですがノンサポートとなりますのでご注意ください。 また、AOFフォーマットはADSv1.2以降では標準のフォーマットからは外されておりますのでそれ以降のツールをお使いになる場合はこの方法は使用できません。
5. armasmのINCBINを使用する(SDT2.50以降)
armasmのINCBINディレクティブはアセンブラファイルに対してファイルをインクルードさせることができます。 インクルードされたファイルはアセンブルされません。
INCBINを実行可能ファイル、リテラルなどといったあらゆる任意のデータのインクルードに使用することができます。 ファイルの中身はまったく翻訳されないでカレントのAOFまたはELFエリアにバイト毎に追加されます。 詳細については、
ADS v1.2 およびRealView Compilation Tools v2.0 Assembler Guideの
7.7.13 INCBIN
または、RealView Compilation Tools v2.1 Assembler Guide
7.7.12 INCBIN
を参照してください。
6. fromelfのオプション指定で結合ファイルを生成する
RVCTでは、fromelfの--bincombined(v4.0以降のみ対応)、--i32combinedおよび--m32combinedを使用することが可能です。これらのオプションは、必要に応じてパディングを加え、複数のロードリージョンを含むイメージのための出力ファイルを生成することが可能です。