Не могу сделать objdump для образа ядра linux

Для 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.:

Исполняемый файл MZ? На ARM64?! Очень удивительно, если не сказать больше.

fuz 11.12.2020 14:22

@fuz см. elixir.bootlin.com/linux/latest/source/arch/arm64/kernel/hea‌​d.S строку 74 и предыдущий комментарий.

Chan Kim 11.12.2020 14:43

Попробуйте objdump -b binary -D. Возможно, вам придется вручную настроить адрес загрузки (--adjust-vma=...), чтобы адреса совпадали.

fuz 11.12.2020 15:29

Это заголовок PECOFF, используемый Windows, поэтому дизассемблер Windows ARM PECOFF, возможно, сможет его разобрать. По крайней мере, он должен видеть, что на самом деле будет выполнять загрузчик ARM UEFI.

Ross Ridge 11.12.2020 19:56

Я только что обнаружил, что на моей машине с Ubuntu файл /boot/vmlinuz-4.15.0-126-generic начинается с «MZ», а первые 512 байтов заканчиваются на 0x55aa (что указывает на то, что он содержит загрузочный код). Но файл изображения в моем вопросе не показывает 0x55aa. Вероятно, потому что он использует метод UEFI/GPT.

Chan Kim 12.12.2020 02:41

пожалуйста, смотрите мой обновленный вопрос. веб-сайт правильно дизассемблирует его.

Chan Kim 12.12.2020 05:27

комментарий fuz выше объясняет, как дизассемблировать его как двоичный файл с помощью objdump. Обратите внимание, что он не будет загружен в виде двоичного файла на ваше устройство Neoverse N1. Поскольку он использует UEFI для загрузки, он загрузит его как образ PECOFF.

Ross Ridge 12.12.2020 07:52
aarch64-none-elf-objdump -b binary -D Image дает мне can't disassemble for architecture UNKNOWN!. Пробовал через objdump (для x86_64), но тоже самое.
Chan Kim 12.12.2020 10:50

@RossRidge Я тщетно искал дизассемблер ARM PECOFF. Можете ли вы помочь мне найти его? Я не уверен, что это он: binaryum.com/faq

Chan Kim 12.12.2020 10:54

Используйте aarch64-none-elf-objdump --help и найдите список supported architectures: ближе к концу. Выберите тот, который наиболее точно соответствует вашему устройству, и используйте его с опцией -m, чтобы указать архитектуру. У вас должна быть возможность собрать версию objdump для Windows ARM64, которая может разобрать ядро, но я не знаю, где вы найдете уже собранную версию. Версия dumbin для ARM64 из Visual Studio должна уметь дизассемблировать его, но это работает только в Windows. IDA Pro должна быть в состоянии разобрать его, но это не бесплатно и требует Windows.

Ross Ridge 12.12.2020 18:26

@RossRidge привет, спасибо, следуя вашему предложению, я добавил -m aarch64, и я могу видеть дизассемблированный код! так что команда была aarch64-none-elf-objdump -b binary -D Image -m aarch64. Я не знал, что мы должны предоставить тип машины в этом бинарном случае. Вы можете опубликовать свой краткий ответ, чтобы я мог его выбрать.

Chan Kim 13.12.2020 02:27

@fuz спасибо за помощь. это было aarch64-none-elf-objdump -b binary -D Image -m aarch64.

Chan Kim 13.12.2020 02:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
799
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Смотрите подсказки в комментариях.
Правильный метод дизассемблирования файла изображения:

aarch64-none-elf-objdump -b двоичный -D Изображение -m aarch64

Другие вопросы по теме