Comment extraire uniquement le contenu brut d'une section ELF?
Question
Je l'ai essayé ce qui suit, mais le fichier résultant est encore un ELF et non uniquement le contenu de la section.
$ objcopy --only-section=<name> <infile> <outfile>
Je veux juste le contenu de la section. Y at-il utilitaire qui peut le faire? Toutes les idées?
La solution
plutôt inélégante pirater autour 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 la section de décalage dans le fichier ELF. J'ai fait l'awk
pour générer une commande dd
pour la coque, car dd
ne supporte pas les nombres hexadécimaux. Et alimenté la commande à corps.
Dans le passé, je l'ai fait tout ce que manuellement, sans faire de scripts, car il est rarement nécessaire.
Autres conseils
Utilisez le format de sortie -O binary
:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Il suffit de vérifier avec avr-objcopy
et la section .text
d'une image AVR ELF.
Notez que si, comme le souligne Tim ci-dessous, votre section n'a pas le drapeau ALLOC, vous pouvez avoir à ajouter --set-section-flags .text=alloc
pour pouvoir l'extraire.
objcopy --dump-section
Introduit dans Binutils 2,25, et permet d'obtenir 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 documents en tant que:
- vidage section sectionname = nom de fichier
Placez le contenu de l'article nommé sectionname dans le nom de fichier de fichier, tout contenu qui en écrasant peut avoir été là auparavant. Cette option est l'inverse de --add-section. Cette option est similaire à l'option --only section, sauf qu'il ne crée pas un fichier formaté, il déverse tout le contenu sous forme de données binaires brutes, sans appliquer les délocalisations. L'option peut être spécifiée plus d'une fois.
Exemple minimal runnable
main.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Assemblez:
as -o main.o main.S
Extraire des données:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Sortie:
00000000 12 34 56 78 |.4Vx|
00000004
texte Extrait:
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.
Dump toutes les sections dans des fichiers séparés.
readelf -a filename|grep "NULL\|LOAD"| (x=0;while read a;do echo "$x $a"|awk '{print "dd if=143 of=filename.section."$1" bs=1 skip=$((" $3")) count=$(("$6"))"}';let x=x+1;done)|bash