Hack plutôt inélégant autour de objdump
et 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
Le objdump -h
produit une sortie prévisible qui contient le décalage de section dans le fichier elf. J'ai fait le awk
pour générer un dd
commande pour le shell, depuis dd
ne prend pas en charge les nombres hexadécimaux. Et envoyé la commande au shell.
Dans le passé, je faisais tout cela manuellement, sans créer de scripts, car c'est rarement nécessaire.
Utilisez le -O binary
format de sortie :
objcopy -O binary --only-section=.text foobar.elf foobar.text
Vient de vérifier avec avr-objcopy
et le .text
d'une image AVR ELF rubrique.
Notez que si, comme Tim le souligne ci-dessous, votre section n'a pas le drapeau ALLOC, vous devrez peut-être ajouter --set-section-flags .text=alloc
pour pouvoir l'extraire.
objcopy --dump-section
Introduit dans Binutils 2.25, et produit un effet similaire à -O binary --only-section
.
Utilisation :
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html le documente comme :
--dump-section nomsection=nomfichier
Placez le contenu de la section nommée sectionname dans le fichier filename, en écrasant tout contenu qui aurait pu s'y trouver auparavant. Cette option est l'inverse de --add-section. Cette option est similaire à l'option --only-section sauf qu'elle ne crée pas de fichier formaté, elle vide simplement le contenu sous forme de données binaires brutes, sans appliquer de déplacement. L'option peut être spécifiée plusieurs fois.
Exemple exécutable minimal
main.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Assembler :
as -o main.o main.S
Extraire les données :
objcopy --dump-section .data=data.bin main.o
hd data.bin
Sortie :
00000000 12 34 56 78 |.4Vx|
00000004
Extraire le texte :
objcopy --dump-section .text=text.bin main.o
hd text.bin
Sortie :
00000000 9a bc de f0 |....|
00000004
Testé dans Ubuntu 18.04 amd64, Binutils 2.30.