Определить адрес загрузки и точку входа раздетого образа ядра Linux
У меня есть кросс-компиляция инструментария для встроенной системы (mipsel) на моем x86 Linux. Я знаю, как построить собственное ядро (давайте назовем образ "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
1 ответ
Со страницы руководства objcopy
objcopy можно использовать для генерации необработанного двоичного файла с использованием выходной цели двоичного файла (например, используйте -O двоичный файл). Когда 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.