2010-10-13 7 views
19

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

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

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

+0

objcopy должен работать. – Jichao

ответ

17

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

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

+3

+1 для грубой силы! – bstpierre

+0

Это звучит смешно, исходящее от меня, но почему бы не прямолинейное * правильное решение от @ndim ??? – Dummy00001

+1

Потому что это не сработало для всех моих тестовых случаев. Вышеизложенное. – mepcotterell

36

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

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

Просто проверяемый avr-objcopy и .text раздел AVR ELF давал изображения.

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

+1

Когда я добавляю это, результат пуст. Он не содержит ни заголовка секции ELF, ни содержимого раздела. Команда, которую я использовал в вопросе, не создает пустой файл. – mepcotterell

+4

Следующие работы для меня: objcopy -O binary -j .text/usr/bin/lpr mylprtext –

+9

Этот аккуратный трюк не работает для всех разделов. 'objcopy' не будет копировать разделы, которые не помечены ни загруженными (« load »), ни выделенными (« alloc »). Комментарий в источнике утверждает, что «содержимое такого раздела не имеет смысла в двоичном формате». –

9

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 сечения = имя файла имя раздела

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

Испытано в Binutils 2.25.1 Ubuntu 15.10, производит такой же вывод, как https://stackoverflow.com/a/3925113/895245

+3

@ Даунвотеры, пожалуйста, объясните, чтобы я мог узнать и улучшить информацию. –