Подтвердить что ты не робот

Извлечь vmlinux из vmlinuz или bzImage

Я хочу сгенерировать System.map из vmlinuz, потому что большинство машин не имеют файла System.map. Фактически, vmlinuz сжимаются до vmlinuz или bzImage.

Может ли это сделать любой инструмент или script?

Я пробовал:

dd if=/boot/vmlinuz skip=`grep -a -b -o -m 1 -e $'\x1f\x8b\x08\x00' /boot/vmlinuz | cut -d: -f 1` bs=1 | zcat > /tmp/vmlinux

Не удалось:

zcat: stdin: not in gzip format
32769+0 records in
32768+0 records out
4b9b3361

Ответ 1

Чтобы извлечь несжатое ядро ​​из образа ядра, вы можете использовать extract-vmlinux script из каталога scripts в дереве ядра (доступного, по крайней мере, в версии ядра 3.5) (если вы получите ошибку, например

mktemp: невозможно создать временный файл /tmp/vmlinux -XXX: недопустимый аргумент

вам нужно заменить $(mktemp /tmp/vmlinux-XXX) на $(mktemp /tmp/vmlinux-XXXXXX) в script). Команда /path/to/kernel/tree/scripts/extract-vmlinux <kernel image> >vmlinux.

Если извлеченный двоичный код ядра содержит информацию о символах, вы должны 1 создать файл System.map, используя mksysmap script из того же подкаталога. Команда здесь NM=nm /path/to/kernel/tree/scripts/mksysmap vmlinux System.map.

¹ Изображения ядра, поставляемые с моим дистрибутивом, кажутся лишенными, поэтому script не смог получить символы.

Ответ 2

Как писал Abrixas2, вам понадобится образ ядра с информацией о символах, чтобы создать файлы System.map, и упакованное изображение vmlinuz вряд ли будет содержать символы. Однако я могу убедиться, что script в вашем исходном сообщении работает с '-e', замененным на '-P' и '$', сброшенными, т.е.

$ dd if=vmlinuz-3.8.0-19-generic skip=`grep -a -b -o -m 1 -P '\x1f\x8b\x08\x00' vmlinuz-3.8.0-19-generic | cut -d: -f 1` bs=1 | zcat > /tmp/vmlinux
gzip: stdin: decompression OK, trailing garbage ignored