Poněkud nevkusný hack kolem objdump
a 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
objdump -h
vytváří předvídatelný výstup, který obsahuje offset sekce v souboru elf. Vytvořil jsem awk
vygenerovat dd
příkaz pro shell, od dd
nepodporuje hexadecimální čísla. A předal příkaz shellu.
V minulosti jsem to všechno dělal ručně, bez vytváření jakýchkoli skriptů, protože je to zřídka potřeba.
Použijte -O binary
výstupní formát:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Právě ověřeno pomocí avr-objcopy
a .text
obrazu AVR ELF sekce.
Všimněte si, že pokud, jak ukazuje Tim níže, vaše sekce nemá příznak ALLOC, možná budete muset přidat --set-section-flags .text=alloc
abyste jej mohli extrahovat.
objcopy --dump-section
Zavedeno v Binutils 2.25 a dosahuje podobného efektu jako -O binary --only-section
.
Použití:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html dokumentuje jako:
--dump-section název sekce=název souboru
Umístěte obsah sekce s názvem sectionname do názvu souboru a přepište veškerý obsah, který tam mohl být dříve. Tato volba je opakem --add-section. Tato volba je podobná volbě --only-section s tím rozdílem, že nevytváří formátovaný soubor, pouze vypíše obsah jako nezpracovaná binární data bez použití jakýchkoli přemístění. Možnost lze zadat více než jednou.
Minimální spustitelný příklad
hlavní.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Sestavení:
as -o main.o main.S
Extrahujte data:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Výstup:
00000000 12 34 56 78 |.4Vx|
00000004
Extrahujte text:
objcopy --dump-section .text=text.bin main.o
hd text.bin
Výstup:
00000000 9a bc de f0 |....|
00000004
Testováno v Ubuntu 18.04 amd64, Binutils 2.30.