Как получить реальную позицию раздела в файле архива 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.$$
Другие вопросы по тегам