L'esempio seguente funziona per me:
$ 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
Vale a dire non è necessario specificare l'arco BFD per i dati binari (è solo utile/necessario per il codice). Dì solo "l'input è binario" e "l'output è ..." e ti creerà il file. Dato che i dati binari puri non sono specifici dell'architettura, tutto quello che devi dire è se l'uscita è a 32 bit() oa 64 bit (elf64-...
), e se è little endian/LSB (...-little
, come su ARM/x86) o grande endian/MSB (...-big
, ad esempio su SPARC/m68k).
Edit: Chiarimento sulle opzioni per objcopy
:
- l'utilizzo dei controlli
-O ...
opzione:
- larghezza bit (se il file ELF sarà a 32 bit o 64-bit)
- endianness (se il file ELF sarà LSB o MSB)
- l'utilizzo dell'opzione
-B ...
controlla l'architettura del file ELF richiederà
È necessario essere indicate le -O ...
ma il -B ...
è facoltativo. La differenza è meglio illustrata da un piccolo esempio:
$ 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. solo l'identificatore del formato di output elf64-x86-64
non lega il binario generato a un'architettura specifica (ecco perché file
dice no machine
). L'utilizzo se lo fa -B i386
- e in tal caso, ti viene detto che questo è ora .
Lo stesso si applica a ARM; -O elf32-little
rispetto a -O elf32-littlearm -B arm
è che nel primo caso, si finisce con uno ELF 32-bit LSB relocatable, no machine, ...
mentre in quest'ultimo, sarà un ELF 32-bit LSB relocatable, ARM...
.
C'è una certa interdipendenza anche qui; è necessario utilizzare l'opzione di output -O elf{32|64}-<arch>
(non generica elf{32|64}-{little|big}
) per poter riconoscere -B ...
.
Vedere objcopy --info
per l'elenco di formati ELF/tipi di BFD che i binutils possono gestire.
Come informazioni sui dati char non firmati [] = {0x12, 0x34, 0x56, 0x78, ...}; 'invece? –
H2CO3, è più o meno quello che sto facendo. Ho un comando pre-compilazione per leggere nel file bin e sputare un file H con una serie di dati (come suggerisci tu). Funziona, ma sembra che ci dovrebbe essere un modo migliore per farlo. – Brian
'bfdarch' non è letterale; Prova a "braccio". Funziona sicuramente come con * gas *, ha una [* .incbin * direttiva] (http://linux.web.cern.ch/linux/scientific4/docs/rhel-as-en-4/incbin.html). Ci sono anche una pletora di programmi come 'hexdump' che convertono gli array binari in 'C'. –