linux shell elf binutils

linux - ¿Cómo extraer solo los contenidos en bruto de una sección ELF?



shell binutils (3)

Más bien poco elegante hackear 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 el desplazamiento de sección en el archivo elf. Hice el awk para generar un comando dd para el shell, ya que dd no admite números hexadecimales. Y alimentó el comando de shell.

En el pasado hice todo eso manualmente, sin hacer ningún script, ya que rara vez es necesario.

He intentado lo siguiente, pero el archivo resultante sigue siendo un ELF y no solo el contenido de la sección.

$ objcopy --only-section=<name> <infile> <outfile>

Solo quiero los contenidos de la sección. ¿Hay alguna utilidad que pueda hacer esto? ¿Algunas ideas?


Utilice el formato de salida -O binary :

objcopy -O binary --only-section=.text foobar.elf foobar.text

Solo se verificó con avr-objcopy y la sección .text de una imagen AVR ELF.

Tenga en cuenta que si, como Tim señala a continuación, su sección no tiene el indicador ALLOC, es posible que tenga que 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 documenta como:

--dump-section sectionname = nombre de archivo

Coloque el contenido de la sección denominada nombre de sección en el nombre de archivo del archivo, sobrescribiendo cualquier contenido que haya 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 con formato, simplemente descarga los contenidos 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

como:

.data .byte 0x12, 0x34, 0x56, 0x78 .text .byte 0x9A, 0xBC, 0xDE, 0xF0

Montar y extraer:

as -o a.o a.S objcopy --dump-section .data=data.bin a.o objcopy --dump-section .text=text.bin a.o hd data.bin hd text.bin

Salida:

00000000 12 34 56 78 |.4Vx| 00000004 00000000 9a bc de f0 |....| 00000004

Probado en Ubuntu 18.04 amd64, Binutils 2.30.