Как извлечь только сырое содержимое раздела ELF?
Я пробовал следующее, но полученный файл по-прежнему является ELF, а не только содержимым раздела.
$ objcopy --only-section=<name> <infile> <outfile>
Мне просто нужно содержимое раздела. Есть ли какая-нибудь утилита, которая может это сделать? Любые идеи?
Ответы
Ответ 1
Скорее неэлегантный взломать 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
не поддерживает шестнадцатеричные числа. И подал команду в оболочку.
В прошлом я делал все это вручную, без каких-либо скриптов, так как он редко нужен.
Ответ 2
Используйте выходной формат -O binary
:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Просто подтвержден с помощью avr-objcopy
и раздела AVR ELF .text
.
Обратите внимание, что если, как указывает Тим ниже, ваш раздел не имеет флага ALLOC, вам может потребоваться добавить --set-section-flags .text=alloc
, чтобы извлечь его.
Ответ 3
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. Эта опция похожа на опцию - -O nly-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.
Ответ 4
Сбросить все разделы в отдельные файлы.
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