Peretasan yang agak janggal di sekitar objdump dan 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 menghasilkan output yang dapat diprediksi yang berisi offset bagian dalam file elf. Saya membuat awk untuk menghasilkan dd perintah untuk shell, sejak dd tidak mendukung angka heksadesimal. Dan memberi perintah ke shell.
Dulu saya melakukan semua itu secara manual, tanpa membuat skrip apa pun, karena jarang diperlukan.
Gunakan -O binary format keluaran:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Cukup verifikasi dengan avr-objcopy dan .text gambar AVR ELF bagian.
Perhatikan bahwa jika, seperti yang ditunjukkan Tim di bawah, bagian Anda tidak memiliki flag ALLOC, Anda mungkin harus menambahkan --set-section-flags .text=alloc untuk dapat mengekstraknya.
objcopy --dump-section
Diperkenalkan di Binutils 2.25, dan mencapai efek yang mirip dengan -O binary --only-section .
Penggunaan:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html mendokumentasikannya sebagai:
--dump-section sectionname=namaberkas
Tempatkan isi bagian bernama namabagian ke dalam nama file file, timpa semua konten yang mungkin sudah ada sebelumnya. Opsi ini kebalikan dari --add-section. Opsi ini mirip dengan opsi --only-section kecuali bahwa opsi ini tidak membuat file yang diformat, opsi ini hanya membuang konten sebagai data biner mentah, tanpa menerapkan relokasi apa pun. Opsi dapat ditentukan lebih dari sekali.
Contoh minimal yang dapat dijalankan
main.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Merakit:
as -o main.o main.S
Ekstrak data:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Keluaran:
00000000 12 34 56 78 |.4Vx|
00000004
Ekstrak teks:
objcopy --dump-section .text=text.bin main.o
hd text.bin
Keluaran:
00000000 9a bc de f0 |....|
00000004
Diuji di Ubuntu 18.04 amd64, Binutils 2.30.