Как извлечь только необработанное содержимое раздела ELF?

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

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

Мне просто нужно содержимое раздела. Есть какая-нибудь утилита, которая может это сделать? Любые идеи?


person mepcotterell    schedule 13.10.2010    source источник
comment
objcopy должен работать.   -  person Jichao    schedule 16.06.2017


Ответы (4)


Достаточно неэлегантно хакнуть вокруг 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 не поддерживает шестнадцатеричные числа. И скормил команду в оболочку.

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

person Dummy00001    schedule 13.10.2010
comment
Это прозвучит забавно, но почему бы не использовать прямое правильное решение от @ndim ??? - person Dummy00001; 14.10.2010
comment
Если размер файла, созданного другим решением, составляет 0 байт, просто добавьте --set-section-flags .sectionname=alloc в командную строку. - person Antti Haapala; 22.09.2014
comment
хорошая идея, но у меня это не работает .. см. мой ответ, который похож - person Zibri; 05.06.2019

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

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

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

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

person ndim    schedule 13.10.2010
comment
Когда я добавляю это, результирующий ‹outfile› пустой. Он не содержит ни заголовка раздела ELF, ни содержимого раздела. Команда, которую я использовал в вопросе, не создает пустой файл. - person mepcotterell; 13.10.2010
comment
Для меня работает следующее: objcopy -O binary -j .text / usr / bin / lpr mylprtext - person Eric Seppanen; 13.10.2010
comment
Этот хитрый прием работает не для всех разделов. objcopy не будет копировать разделы, которые не помечены как загруженные (load) или выделенные (alloc). Комментарий в источнике утверждает, что содержимое такого раздела не имеет смысла в двоичном формате. - person Tim Schaeffer; 06.04.2011
comment
Как ни странно, но objcopy печатает: Невозможно распознать формат входного файла `elf.img ', когда objdump печатает разделы нормально. - person Vanuan; 20.12.2011
comment
Это вместе с --set-section-flags позволило мне сбрасывать атрибуты .ARM.attributes в файл. Не стал бы трогать awk-скрипт в другом ответе палкой;) +1. - person Antti Haapala; 22.09.2014

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 = имя файла

Поместите содержимое раздела с именем 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, Binutils 2.30.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 04.09.2015
comment
Это должен быть лучший ответ. - person Michal Štein; 28.02.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
person Zibri    schedule 05.06.2019