Comment extraire uniquement le contenu brut d'une section ELF?
j'ai essayé ce qui suit, mais le fichier résultant est toujours un ELF et pas seulement le contenu de la section.
$ objcopy --only-section=<name> <infile> <outfile>
je veux juste le contenu de la section. Est-il un utilitaire qui peut faire cela? Des idées?
3 réponses
plutôt inélégant hack 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" "] skip=$[0x" "]"}' |
bash
le objdump -h
produit une sortie prévisible qui contient la compensation de section dans le fichier elf. J'ai fait le awk
pour générer une commande dd
pour le shell, puisque dd
ne supporte pas les nombres hexadécimaux. Et a donné le commandement à shell.
dans le passé j'ai fait tout cela manuellement, sans faire de scripts, car il est rarement nécessaire.
utiliser le -O binary
format de sortie:
objcopy -O binary --only-section=.text foobar.elf foobar.text
vient de vérifier avec avr-objcopy
et la section .text
d'une image AVR.
notez que si, comme Tim le fait remarquer ci-dessous, votre section n'a pas le flag ALLOC, vous devrez peut-être ajouter --set-section-flags .text=alloc
pour pouvoir l'extraire.
objcopy --dump-section
introduit dans les Binutils 2.25, et atteint 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 suit:
--dump-section nom de section=nom de fichier
placer le contenu de la section nommée sectionname dans le nom du fichier, 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 en données binaires brutes, sans appliquer de relocalisations. L'option peut être spécifié plus d'une fois.
exemple de fonctionnement Minimal
A. S:
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
assembler et extraire:
as -o a.o a.S
objcopy --dump-section .data=data.bin a.o
objcopy --dump-section .text=text.bin a.o
hd data.bin
hd text.bin
sortie:
00000000 12 34 56 78 |.4Vx|
00000004
00000000 9a bc de f0 |....|
00000004
testé dans Ubuntu 18.04 amd64, Binutils 2.30.