Для Arm N1 SDP (платформа проектирования системы для чипа N1) после того, как я создам программное обеспечение в соответствии с указаниями Getting Started
, у меня есть выходной файл linux/out/n1sdp/arch/arm64/boot/Image
.
Я видел, когда я передал файл как ядро в qemu-system-aarch64, загрузка Linux началась и дошла до определенного этапа. так что это явно код arm64. Файл начинается так, если смотреть в шестнадцатеричных данных, ..
00000000: 4d5a 0091 ff3f 4914 0000 0800 0000 0000 MZ...?I.........
00000010: 0040 9b01 0000 0000 0a00 0000 0000 0000 .@..............
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 4152 4d64 4000 0000 ........ARMd@...
00000040: 5045 0000 64aa 0200 0000 0000 0000 0000 PE..d...........
00000050: 0000 0000 a000 0602 0b02 0214 0060 3001 .............`0.
00000060: 00d0 6a00 0000 0000 7850 2501 0010 0000 ..j.....xP%.....
00000070: 0000 0000 0000 0000 0010 0000 0002 0000 ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000090: 0040 9b01 0010 0000 0000 0000 0a00 0000 .@..............
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000c0: 0000 0000 0600 0000 0000 0000 0000 0000 ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000f0: 0000 0000 0000 0000 2e74 6578 7400 0000 .........text...
00000100: 0060 3001 0010 0000 0060 3001 0010 0000 .`0......`0.....
00000110: 0000 0000 0000 0000 0000 0000 2000 0060 ............ ..`
00000120: 2e64 6174 6100 0000 00d0 6a00 0070 3001 .data.....j..p0.
00000130: 00da 6100 0070 3001 0000 0000 0000 0000 ..a..p0.........
00000140: 0000 0000 4000 00c0 1f20 03d5 1f20 03d5 ....@.... ... ..
00000150: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000160: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000170: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000180: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000190: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
000001a0: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
000001b0: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
000001c0: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
000001d0: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
000001e0: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
000001f0: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000200: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000210: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000220: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000230: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
00000240: 1f20 03d5 1f20 03d5 1f20 03d5 1f20 03d5 . ... ... ... ..
Из первого шаблона я вижу, что это код start.S Linux (первые два байта - бессмысленная инструкция перехода для создания магического шаблона «MZ», я узнал это раньше). Вот в чем проблема. Я думаю, что делал это раньше, но когда я пытался разобрать его, я получаю сообщение об ошибке, как показано ниже.
ckim@chan-ubuntu:~/N1SDP/arm-reference-platforms$ aarch64-none-elf-objdump -d linux/out/n1sdp/arch/arm64/boot/Image aarch64-none-elf-objdump: linux/out/n1sdp/arch/arm64/boot/Image: файл формат не распознан
Какая правильная команда для его разборки?
ДОБАВИТЬ: Я попытался дизассемблировать с помощью службы веб-сайта (https://onlinedisassembler.com/odaweb/), и он правильно дизассемблирует его. Вижу маркировку МЗ и инструкцию ветки. Так что, думаю, его можно будет разобрать с помощью aarch-none-eabi-objdump.:
@fuz см. elixir.bootlin.com/linux/latest/source/arch/arm64/kernel/head.S строку 74 и предыдущий комментарий.
Попробуйте objdump -b binary -D
. Возможно, вам придется вручную настроить адрес загрузки (--adjust-vma=...
), чтобы адреса совпадали.
Это заголовок PECOFF, используемый Windows, поэтому дизассемблер Windows ARM PECOFF, возможно, сможет его разобрать. По крайней мере, он должен видеть, что на самом деле будет выполнять загрузчик ARM UEFI.
Я только что обнаружил, что на моей машине с Ubuntu файл /boot/vmlinuz-4.15.0-126-generic начинается с «MZ», а первые 512 байтов заканчиваются на 0x55aa (что указывает на то, что он содержит загрузочный код). Но файл изображения в моем вопросе не показывает 0x55aa. Вероятно, потому что он использует метод UEFI/GPT.
пожалуйста, смотрите мой обновленный вопрос. веб-сайт правильно дизассемблирует его.
комментарий fuz выше объясняет, как дизассемблировать его как двоичный файл с помощью objdump
. Обратите внимание, что он не будет загружен в виде двоичного файла на ваше устройство Neoverse N1. Поскольку он использует UEFI для загрузки, он загрузит его как образ PECOFF.
aarch64-none-elf-objdump -b binary -D Image
дает мне can't disassemble for architecture UNKNOWN!
. Пробовал через objdump (для x86_64), но тоже самое.
@RossRidge Я тщетно искал дизассемблер ARM PECOFF. Можете ли вы помочь мне найти его? Я не уверен, что это он: binaryum.com/faq
Используйте aarch64-none-elf-objdump --help
и найдите список supported architectures:
ближе к концу. Выберите тот, который наиболее точно соответствует вашему устройству, и используйте его с опцией -m
, чтобы указать архитектуру. У вас должна быть возможность собрать версию objdump
для Windows ARM64, которая может разобрать ядро, но я не знаю, где вы найдете уже собранную версию. Версия dumbin
для ARM64 из Visual Studio должна уметь дизассемблировать его, но это работает только в Windows. IDA Pro должна быть в состоянии разобрать его, но это не бесплатно и требует Windows.
@RossRidge привет, спасибо, следуя вашему предложению, я добавил -m aarch64, и я могу видеть дизассемблированный код! так что команда была aarch64-none-elf-objdump -b binary -D Image -m aarch64
. Я не знал, что мы должны предоставить тип машины в этом бинарном случае. Вы можете опубликовать свой краткий ответ, чтобы я мог его выбрать.
@fuz спасибо за помощь. это было aarch64-none-elf-objdump -b binary -D Image -m aarch64
.
Смотрите подсказки в комментариях.
Правильный метод дизассемблирования файла изображения:
aarch64-none-elf-objdump -b двоичный -D Изображение -m aarch64
Исполняемый файл MZ? На ARM64?! Очень удивительно, если не сказать больше.