Ziemlich uneleganter Hack um objdump
und 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
Die objdump -h
erzeugt eine vorhersagbare Ausgabe, die einen Abschnittsversatz in der elf-Datei enthält. Ich habe die awk
gemacht um einen dd
zu generieren Befehl für die Shell, seit dd
unterstützt keine Hexadezimalzahlen. Und den Befehl an die Shell übergeben.
In der Vergangenheit habe ich das alles manuell gemacht, ohne Skripte zu erstellen, da es selten benötigt wird.
Verwenden Sie den -O binary
Ausgabeformat:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Gerade mit avr-objcopy
verifiziert und .text
eines AVR-ELF-Bildes Abschnitt.
Beachten Sie, dass, wenn Ihr Abschnitt, wie Tim unten betont, das ALLOC-Flag nicht hat, Sie möglicherweise --set-section-flags .text=alloc
hinzufügen müssen um es extrahieren zu können.
objcopy --dump-section
Eingeführt in Binutils 2.25 und erzielt einen ähnlichen Effekt wie -O binary --only-section
.
Verwendung:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html dokumentiert es als:
--dump-section Abschnittsname=Dateiname
Platzieren Sie den Inhalt des Abschnitts mit dem Namen Abschnittsname in der Datei Dateiname und überschreiben Sie alle Inhalte, die möglicherweise zuvor dort waren. Diese Option ist das Gegenteil von --add-section. Diese Option ähnelt der Option --only-section, außer dass sie keine formatierte Datei erstellt, sondern nur den Inhalt als rohe Binärdaten ausgibt, ohne dass Verschiebungen angewendet werden. Die Option kann mehrfach angegeben werden.
Minimales lauffähiges Beispiel
main.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Zusammenbauen:
as -o main.o main.S
Daten extrahieren:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Ausgabe:
00000000 12 34 56 78 |.4Vx|
00000004
Text extrahieren:
objcopy --dump-section .text=text.bin main.o
hd text.bin
Ausgabe:
00000000 9a bc de f0 |....|
00000004
Getestet in Ubuntu 18.04 amd64, Binutils 2.30.