Определить адрес загрузки и точку входа очищенного образа ядра Linux - PullRequest
5 голосов
/ 12 января 2012

У меня есть кросс-компиляция инструментария для встроенной системы (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 Ответ

1 голос
/ 12 января 2012

Со страницы руководства objcopy

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

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

original 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.

...