Hack piuttosto poco elegante intorno a objdump
e dd
:
IN_F=/bin/echo
OUT_F=./tmp1.bin
SECTION=.text
objdump -h $IN_F |
grep $SECTION |
awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
bash
Il objdump -h
produce un output prevedibile che contiene l'offset della sezione nel file elf. Ho fatto il awk
per generare un dd
comando per la shell, poiché dd
non supporta i numeri esadecimali. E ha dato il comando alla shell.
In passato ho fatto tutto questo manualmente, senza creare alcuno script, dato che è raramente necessario.
Usa il -O binary
formato di output:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Appena verificato con avr-objcopy
e .text
di un'immagine AVR ELF sezione.
Nota che se, come Tim sottolinea di seguito, la tua sezione non ha il flag ALLOC, potresti dover aggiungere --set-section-flags .text=alloc
per poterlo estrarre.
objcopy --dump-section
Introdotto in Binutils 2.25, ottiene un effetto simile a -O binary --only-section
.
Utilizzo:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html lo documenta come:
--dump-section nomesezione=nomefile
Posiziona il contenuto della sezione denominata sectionname nel file filename, sovrascrivendo eventuali contenuti che potrebbero esserci stati in precedenza. Questa opzione è l'inverso di --add-section. Questa opzione è simile all'opzione --only-section tranne per il fatto che non crea un file formattato, scarica semplicemente il contenuto come dati binari grezzi, senza applicare alcuna rilocazione. L'opzione può essere specificata più di una volta.
Esempio eseguibile minimo
main.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Assemblare:
as -o main.o main.S
Estrai dati:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Uscita:
00000000 12 34 56 78 |.4Vx|
00000004
Estrai testo:
objcopy --dump-section .text=text.bin main.o
hd text.bin
Uscita:
00000000 9a bc de f0 |....|
00000004
Testato in Ubuntu 18.04 amd64, Binutils 2.30.