¿Cómo extraer solo el contenido en bruto de una sección de ELFOS?


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

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

Solo quiero el contenido de la sección. ¿Hay alguna utilidad que pueda hacer esto? Alguna idea?

3 answers

Bastante poco elegante hack alrededor 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 soporta números hexadecimales. Y alimentó el comando a shell.

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

 18
Author: Dummy00001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 15:56:32

Utilice el formato de salida -O binary:

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

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

Tenga en cuenta que si, como Tim señala a continuación, su sección no tiene la bandera ALLOC, es posible que tenga que agregar --set-section-flags .text=alloc para poder extraerla.

 43
Author: ndim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-08 12:32:22

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 dump-section sectionname = filename

Coloque el contenido de la sección llamada sectionname en el archivo filename, sobrescribiendo cualquier contenido que pueda haber estado allí anteriormente. Esta opción es la inversa de add add-section. Esta opción es similar a la opción only 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

A. S:

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

Ensamblar 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.

 13
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-19 10:48:22