Das folgende Beispiel funktioniert für mich:
$ 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
D.h. keine Notwendigkeit, den BFD-Bogen für binäre Daten zu spezifizieren (es ist nur nützlich/notwendig für Code). Sagen Sie einfach "die Eingabe ist binär" und "die Ausgabe ist ..." und es wird die Datei erstellt. Da reine binäre Daten nicht architekturspezifisch sind, müssen Sie nur sagen, ob die Ausgabe 32 Bit (elf32-...
) oder 64 Bit (elf64-...
) ist und ob Little Endian/LSB (...-little
, wie auf ARM/x86) oder groß ist Endian/MSB (...-big
, wie zB auf SPARC/m68k).
Edit: Klärung über die Optionen für objcopy
:
- die Nutzung der
-O ...
Option Kontrollen:
- Bit-Breite (ob die ELF-Datei seiner 32-Bit- oder 64-Bit)
- endianness (ob die ELF-Datei LSB oder MSB) wird
- die Nutzung der
-B ...
Option steuert die Architektur der ELF-Datei
Wunsch erhalten Sie haben die -O ...
specifiy aber die -B ...
ist optional. Der Unterschied wird am besten anhand eines kleinen Beispiels veranschaulicht:
$ 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
I.e. nur der Ausgabeformat-Spezifizierer elf64-x86-64
bindet die generierte Binärdatei nicht an eine bestimmte Architektur (deshalb file
sagt no machine
). Die Verwendung, wenn -B i386
tut dies - und in diesem Fall wird Ihnen gesagt, dies ist jetzt .
Das gleiche würde für ARM gelten; -O elf32-little
vs -O elf32-littlearm -B arm
ist, dass im ersten Fall, Sie mit einer ELF 32-bit LSB relocatable, no machine, ...
enden, während in der letzteren, wird es eine ELF 32-bit LSB relocatable, ARM...
sein.
Auch hier gibt es einige Abhängigkeiten; Sie müssen die -O elf{32|64}-<arch>
(nicht die allgemeine elf{32|64}-{little|big}
) Ausgabeoption verwenden, um -B ...
erkannt zu machen.
Eine Liste der ELF-Formate/BFD-Typen, mit denen Ihre binutils umgehen können, finden Sie unter objcopy --info
.
How'bout 'unsigned Char Daten [] = {0x12, 0x34, 0x56, 0x78, ...};' stattdessen? –
H2CO3, das ist ziemlich genau das, was ich mache. Ich habe einen Pre-Build-Befehl, um die Bin-Datei einzulesen und spucke eine H-Datei mit einem Array von Daten aus (wie Sie es vorschlagen). Es funktioniert, aber es scheint, als sollte es einen besseren Weg geben, es zu tun. – Brian
'bfdarch' ist nicht literal; Versuche 'Arm'. Das funktioniert definitiv so wie mit * gas *, es hat eine [* .incbin * Direktive] (http://linux.web.cern.ch/linux/scientific4/docs/rhel-as-en-4/incbin.html). Es gibt auch eine Fülle von Programmen wie 'hexdump', die binäre in 'C'-Arrays konvertieren. –