次の例私の作品:
$ 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
は、生成されたバイナリを特定のアーキテクチャに結びつけません(そのため、file
はno 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
を参照してください。
代わりに 'unsigned char data [] = {0x12、0x34、0x56、0x78、...};の代わりに? –
H2CO3、それは私がやっていることです。私はビンファイルを読み込むためのビルド前のコマンドを持っていて、データの配列でHファイルを吐き出す(あなたのように)。それは動作しますが、それを実行するより良い方法があるように思われます。 – Brian
'bfdarch'はリテラルではありません。 「アーム」を試してみてください。これは間違いなく* gas *のように動作し、[* .incbin *ディレクティブ](http://linux.web.cern.ch/linux/scientific4/docs/rhel-as-en-4/incbin.html)を持っています。 )。バイナリを 'C'配列に変換する 'hexdump'のようなプログラムもたくさんあります。 –