Как получить реальную позицию раздела в файле архива ELF?
Я хочу извлечь бинарный раздел из архива ELF в Linux.
Когда я запускаю objdump -h для файла архива, он перечисляет содержащиеся в нем объектные файлы и заголовки разделов для каждого раздела. Однако столбец смещения файла, по-видимому, связан с положением объектного файла в архиве, так как в противном случае они будут перекрывать все разделы.
Я ожидал, что смогу использовать dd для извлечения двоичной информации из файла архива. (см. Как вы извлекаете только содержимое раздела ELF). Как мне сделать это с архивом?
Я должен также упомянуть, что раздел, который я извлекаю, добавлен этой командой:
echo "hi" > commentFile
objcopy libmylib.a --add-section .mysection=commentFile libmylib.a
1 ответ
столбец смещения файла отображается относительно положения файла объекта в архиве
Смещение файла, из которого вы получаете objdump
относительно начала отдельного объектного файла. Вы можете думать о библиотеке архива как о книжной полке, и вывод objdump -h
в качестве индекса в каждой отдельной книге. Вы не ожидали, что индекс изменится в зависимости от того, какие другие книги находятся на полке, или когда вы берете книгу с полки. Точно так же сам объектный файл (и вывод objdump -h
) не изменяется, когда вы кладете в библиотеку или извлекаете ее снова (вы получаете бит-идентичную копию).
Я ожидал, что смогу использовать dd для извлечения двоичной информации из файла архива
Вы могли бы использовать dd
, но вы должны сначала найти положение каждого отдельного объектного файла в архиве. Это не так уж сложно: формат файлов архива UNIX задокументирован. Но формат может меняться в зависимости от того, какой вариант UNIX вы используете, и он не является действительно необходимым для задачи, которую вы хотите выполнить.
Как мне сделать это с архивом?
Если вы знаете, что .mysection
имеет одинаковое содержимое во всех объектных файлах в libmylib.a
(как было бы в случае с objcopy --add-section
команда, которую вы дали), затем извлеките один объект из архива, затем извлеките раздел:
firstobj=$(ar t libmylib.a | grep '\.o$' | head -1)
ar x libmylib.a $firstobj
# use objdump -h and dd to extract section context.
# or use "readelf -p .mysection $firstobj
rm -f $firstobj
Если содержание .mysection
могут отличаться в разных объектных файлах, распаковать их во временный каталог:
mkdir tmp.$$ && cd tmp.$$ && ar x ../libmylib.a
for obj in $(find . -type f); do
# extract .mysection from $obj
done
cd .. && rm -rf tmp.$$