MyTetra Share
Делитесь знаниями!
Как посмотреть дизассеблерный код для бинарника под ARM-архитектуру
Время создания: 04.05.2022 22:18
Текстовые метки: linux, gcc, компиляция, кросскомпиляция, дизассемблер, код, arm, stm32
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/165169191374jbgdxf5n/text.html на raw.github.com

При разработке ПО под микроконтроллеры иногда возникает необходимость посмотреть код, который генерируется компилятором. В ОС Linux среда разработки обычно компилирует код для микроконтроллера через специальную версию компилятора gcc, (пакет gcc-arm-none-eabi, исполняемый файл компилятора arm-none-eabi-gcc) который создает бинарник elf-формата с кодами для ARM-микропроцессора. Затем этот бинарник преобразуется в bin-файл и заливается в микроконтроллер.


Таким образом, чтобы посмотреть дизассемблерный код, надо воспользоваться специальной версией утилиты objdump, которая создана для ARM-кода, и которую нужно натравить на elf-файл с ARM-кодом. Эта версия утилиты находится в пакете binutils-arm-none-eabi, и называется:



arm-none-eabi-objdump



Команда для просмотра дизассемблированного листинга из elf-файла выглядит так:



arm-none-eabi-objdump -D -m arm <имя_файла.elf>



В полученном листинге будут видны различные вспомогательные секции кода, и код каждой функции, включая функцию main():



080002c8 <main>:

80002c8: b538 push {r3, r4, r5, lr}

80002ca: 4c10 ldr r4, [pc, #64] ; (800030c <main+0x44>)

80002cc: f7ff ff8a bl 80001e4 <clockInit>

80002d0: f7ff ffdc bl 800028c <portClockInit>

80002d4: 6822 ldr r2, [r4, #0]

80002d6: f022 020f bic.w r2, r2, #15

80002da: 6022 str r2, [r4, #0]

80002dc: 6822 ldr r2, [r4, #0]

80002de: f042 0203 orr.w r2, r2, #3

80002e2: 6022 str r2, [r4, #0]

...



В первом столбце выводятся адреса. Это реальные адреса, по которым будет располагаться код внутри микроконтроллера.


Во втором-третьем столбце выводятся опкоды машинных команд (оно же машинные инструкции, машинный код).


В следующем столбце выводятся мнемотика команд (оно же - язык Ассемблера).


* * *


В принципе, утилита objdump представляет из себя неинтерактивный дизассемблер командной строки. Это одна из самых первых утилит, которая должна быть в арсенале embedded-разработчика. Если elf-файл не стрипнут и имеет таблицу именований символов, то эта утилита покажет максимум из того, что есть в elf-файле со всеми дополнительными секциями.


Так же в этом разделе:
 
MyTetra Share v.0.58
Яндекс индекс цитирования