Как извлечь только сырое содержимое раздела ELF? - PullRequest
24 голосов
/ 13 октября 2010

Я попробовал следующее, но полученный файл все еще является ELF, а не просто содержимым раздела.

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

Я просто хочу содержимое раздела. Есть ли утилита, которая может сделать это? Есть идеи?

Ответы [ 4 ]

47 голосов
/ 13 октября 2010

Используйте выходной формат -O binary:

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

Только что проверено с помощью avr-objcopy и секции .text изображения AVR ELF.

Обратите внимание, что если, как указывает Тимниже, в вашем разделе нет флага ALLOC, возможно, вам придется добавить --set-section-flags .text=alloc, чтобы иметь возможность извлечь его.

19 голосов
/ 13 октября 2010

Скорее не элегантный хак вокруг objdump и 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 производит предсказуемый вывод, который содержит смещение раздела в файле elf. Я сделал awk, чтобы сгенерировать команду dd для оболочки, поскольку dd не поддерживает шестнадцатеричные числа. И кормил команду оболочкой.

Раньше я делал все это вручную, без каких-либо сценариев, поскольку это редко требовалось.

15 голосов

objcopy --dump-section

Введено в Binutils 2.25 и обеспечивает эффект, аналогичный -O binary --only-section.

Использование:

objcopy --dump-section .text=output.bin input.o

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html документирует это как:

- dump-section sectionname = filename

Поместить содержимое раздела с именем sectionname в имя файла файла, перезаписывая любое содержимое, которое можетбыли там ранее.Эта опция является обратной к --add-section.Эта опция похожа на опцию --only-section за исключением того, что она не создает отформатированный файл, она просто выгружает содержимое в виде необработанных двоичных данных, не применяя никаких перемещений.Опция может быть указана более одного раза.

Пример минимального запуска

main.S

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

Сборка:

as -o main.o main.S

Извлечение данных:

objcopy --dump-section .data=data.bin main.o
hd data.bin

Вывод:

00000000  12 34 56 78                                       |.4Vx|
00000004

Извлечение текста:

objcopy --dump-section .text=text.bin main.o
hd text.bin

Вывод:

00000000  9a bc de f0                                       |....|
00000004

Проверено в Ubuntu 18.04 amd64, Binutils2,30.

0 голосов
/ 05 июня 2019

Создать все разделы в отдельных файлах.

readelf -a filename|grep "NULL\|LOAD"| (x=0;while read a;do echo "$x $a"|awk '{print "dd if=143 of=filename.section."$1" bs=1 skip=$((" $3")) count=$(("$6"))"}';let x=x+1;done)|bash
...