Определите адрес загрузки и точку входа удаленного образа ядра Linux

У меня есть набор инструментов для кросс-компиляции для встроенной системы (mipsel) на моем Linux x86. Я знаю, как создать для него собственное ядро ​​(назовем его образ "vmlinux") и как удалить это изображение через

objcopy -S -O binary vmlinux vmlinux.bin

Для дальнейшей обработки мне также понадобятся адрес загрузки и точка входа изображения. Перед удалением их можно без проблем определить через scripts/mksysmap или, точнее, через

nm -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > System.map

Затем я могу определить адрес загрузки и точку входа через

awk '/A _text/ { print "0x"$1; }' < _System.map
awk '/T kernel_entry/ { print "0x"$1; }' < System.map

Проблема в том, что иногда я не собираю ядро ​​самостоятельно, а получаю предварительно созданное ядро ​​после, когда оно уже было удалено из его символов с помощью objcopy. Кто-нибудь может сказать мне, как это сделать? Я не очень разбираюсь в построении ядра и использовании инструментальных средств. И nm, и objdump не любят вырезанное изображение, говоря

vmlinux.bin: File format not recognized

person kriegaex    schedule 12.01.2012    source источник


Ответы (1)


На странице руководства по objcopy

objcopy можно использовать для создания необработанного двоичного файла, используя двоичный целевой объект вывода (например, используйте -O binary). Когда objcopy генерирует необработанный двоичный файл, он по существу создает дамп памяти содержимого входного объектного файла. Все символы и информация о перемещении будут удалены. Дамп памяти начнется с виртуального адреса самого нижнего раздела, скопированного в выходной файл.

Вот пример, который можно использовать в архитектуре PowerPC:

оригинальный vmlinux

bash-3.2$ file vmlinux
vmlinux: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped

удаленный vmlinux считается файлом данных

bash-3.2$ file vmlinux.bin
vmlinux.bin: data

преобразование двоичного файла в формат ELF для PowerPC

bash-3.2$ powerpc-440fp-linux-objcopy -I binary vmlinux.bin -B powerpc -O elf32-powerpc vmlinux.bin.x

вывод vmlinux теперь считается файлом ELF

bash-3.2$ file vmlinux.bin.x
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped

Вы должны передать параметры -I, -B и -O. Вы можете получить эти параметры из документации по objcopy.

Но поскольку ваш двоичный файл уже удален, попытка декомпиляции может быть бесполезной, поскольку информация о разделе недоступна. Все данные в файле будут сброшены в секцию .data.

person sessyargc.jp    schedule 12.01.2012
comment
Запоздалое спасибо за этот ответ. К сожалению, я не получил уведомление об ответе по электронной почте, извините. На самом деле мне удалось найти другой способ узнать адрес загрузки и точку входа, но мое решение было специфичным для ситуации и не могло применяться в целом, поэтому я не цитирую его здесь. Позвольте мне просто сказать, что ваше предлагаемое решение действительно создает файл ELF, но файл не содержит желаемой информации о перемещении. Таким образом, информация не может быть извлечена из него через nm -n. В любом случае спасибо за ответ. - person kriegaex; 12.06.2012