2013-06-23 22 views
6

生のバイナリデータをリンクしたいと思います。私はそれを特定のアドレスに置くか、コード内で定義したシンボル(char * mydataなど)にリンクさせたいと思います。 objファイルではないので、単にリンクすることはできません。GCC ARMツールチェーンを使用して任意のデータをリンクする

同様の投稿(Include binary file with GNU ld linker script)は、objcopyを-B bfdarchオプションで使用することを提案しています。 objcopyは "archictecture bfdarch unknown"で応答します。

もう1つの答えは、オブジェクトをカスタムLDスクリプトに変換し、メインLDスクリプトから変換することを示唆しています。この時点では、Cインクルードファイル(これは私が今やっていることです)を使っているだけかもしれませんので、私はむしろそれをしません。

これを達成するためにobjcopyを使用できますか、それとも別の方法ですか?それを行うには

+3

代わりに 'unsigned char data [] = {0x12、0x34、0x56、0x78、...};の代わりに? –

+0

H2CO3、それは私がやっていることです。私はビンファイルを読み込むためのビルド前のコマンドを持っていて、データの配列でHファイルを吐き出す(あなたのように)。それは動作しますが、それを実行するより良い方法があるように思われます。 – Brian

+1

'bfdarch'はリテラルではありません。 「アーム」を試してみてください。これは間違いなく* gas *のように動作し、[* .incbin *ディレクティブ](http://linux.web.cern.ch/linux/scientific4/docs/rhel-as-en-4/incbin.html)を持っています。 )。バイナリを 'C'配列に変換する 'hexdump'のようなプログラムもたくさんあります。 –

答えて

9

次の例私の作品:

$ dd if=/dev/urandom of=binblob bs=1024k count=1 
$ objcopy -I binary -O elf32-little binblob binblob.o 
$ file binblob.o 
binblob.o: ELF 32-bit LSB relocatable, no machine, version 1 (SYSV), not stripped 
$ nm -S -t d binblob.o 
0000000001048576 D _binary_binblob_end 
0000000001048576 A _binary_binblob_size 
0000000000000000 D _binary_binblob_start 

すなわち、バイナリデータのBFDアーチを指定する必要はありません(コードにのみ便利です)。 「入力はバイナリです」と「出力は...」と言って、ファイルを作成します。純粋なバイナリデータはアーキテクチャ固有ではありませんので、あなたがそれを伝えるために必要なすべての出力が32ビット(elf32-...)または64ビット(elf64-...)であり、それはリトルエンディアン/ LSB(ARM/x86の上など...-little、)または大きいですかかどうかでありますエンディアン/ MSB(...-big、例えばSPARC/m68kのように)。

編集:objcopyのオプションに 明確化:

  • -O ...オプションコントロールの使用:
    • ビット幅(ELFファイルがあるかどうか32ビットまたは64ビット)
    • エンディアン(ELFファイルがLSBかMSBかにかかわらず)
  • -B ...オプションの使用は、あなたが-O ...をspecifiyするを持っているアーキテクチャは、ELFファイルは

を要求しますが、制御-B ...はオプションです。その相違点は、小さな例で最もよく説明されています。

$ objcopy -I binary -O elf64-x86-64 foobar foobar.o 
$ file foobar.o 
foobar.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped 

$ objcopy -I binary -O elf64-x86-64 -B i386 foobar foobar.o 
$ file foobar.o 
foobar.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

e.e.e.出力フォーマット指定子elf64-x86-64は、生成されたバイナリを特定のアーキテクチャに結びつけません(そのため、fileno machineとなります)。 -B i386の場合の使用は - その場合、これは今ではと言われています。

同じことがARMにも適用されます。 -O elf32-little-O elf32-littlearm -B armの場合は、前者の場合はELF 32-bit LSB relocatable, no machine, ...、後者の場合はELF 32-bit LSB relocatable, ARM...となります。

ここでもいくつかの相互依存関係があります。 -B ...を認識させるには、-O elf{32|64}-<arch>(汎用のelf{32|64}-{little|big}ではなく)出力オプションを使用する必要があります。

binutilsが処理できるELFフォーマット/ BFDタイプのリストについては、objcopy --infoを参照してください。

+0

それを行うには良い方法のように見えます。私はこれを試してみる。私が使用しているツールチェインのバージョンでは、出力タイプは「elf32-littlearm」 – Brian

+1

組み込みプラットフォームで作業している場合は、データをRAMにロードするのではなく、フラッシュに入れたままにしておくことをお勧めします。 --rename-section .data = .rodata – escrafford

+1

arm-none-eabi-objcopy -Iバイナリ-O elf32-littlearm -Bアーム--rename-section .data = .rodata binblob binblob.o – escrafford

1

簡単な方法は、それ自体での.oなるように(.C .Hない)独自の.cファイルにデータを置くことであろうその後、リンカスクリプトでは、特定のメモリ空間を定義することができますその.oファイルのセクションエントリを作成し、必要な場所に配置します。

MEMORY 
{ 
... 
BOB : ORIGIN = 0x123400, length = 0x200 
... 
} 
SECTIONS 
{ 
... 
TED : { mydata.o } > BOB 
... 
} 
5

xxdを使用することもできます。ファイルで

xxd -i your_data your_data.c 

次の2つのシンボルunsigned char your_data[]unsigned int your_data_lenを取得します。最初のものはあなたのデータを含む巨大な配列になり、2番目はその配列の長さになります。作成されたCファイルの

コンパイル時間服用かもしれないので、あなたは、ビルドシステムを使用している場合、/ Makefileが適切に不要な再コンパイルを避けるそれを扱います。

xxdは、Linuxディストリビューションのvimvim-common)パッケージの一部である必要があります。

+1

私はちょうど同じ答えを書くつもりでした。 :) – dbrank0

関連する問題