Truco bastante poco elegante alrededor de objdump
y 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
El objdump -h
produce una salida predecible que contiene un desplazamiento de sección en el archivo elf. Hice el awk
para generar un dd
comando para el shell, desde dd
no admite números hexadecimales. Y envió el comando al shell.
En el pasado, hice todo eso manualmente, sin crear ningún script, ya que rara vez se necesita.
Usa el -O binary
formato de salida:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Recién verificado con avr-objcopy
y una imagen AVR ELF .text
sección.
Tenga en cuenta que si, como señala Tim a continuación, su sección no tiene el indicador ALLOC, es posible que deba agregar --set-section-flags .text=alloc
para poder extraerlo.
objcopy --dump-section
Introducido en Binutils 2.25, y logra un efecto similar a -O binary --only-section
.
Uso:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html lo documenta como:
--dump-section nombre_sección=nombre_archivo
Coloque el contenido de la sección denominada nombre de sección en el archivo nombre de archivo, sobrescribiendo cualquier contenido que pueda haber estado allí anteriormente. Esta opción es la inversa de --add-section. Esta opción es similar a la opción --only-section excepto que no crea un archivo formateado, simplemente vuelca el contenido como datos binarios sin procesar, sin aplicar ninguna reubicación. La opción se puede especificar más de una vez.
Ejemplo ejecutable mínimo
principal.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Ensamblar:
as -o main.o main.S
Extraer datos:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Salida:
00000000 12 34 56 78 |.4Vx|
00000004
Extraer texto:
objcopy --dump-section .text=text.bin main.o
hd text.bin
Salida:
00000000 9a bc de f0 |....|
00000004
Probado en Ubuntu 18.04 amd64, Binutils 2.30.