Как мне разобрать сырой код MIPS? - PullRequest
4 голосов
/ 29 марта 2012

Аналогично Как мне разобрать необработанный код x86? , но тогда для архитектуры MIPS: как мне разобрать необработанный код MIPS с objdump?Я хочу проверить инструкции в образе vmlinux, но для этого мне нужно:

: > x.c
mipsel-linux-gnu-gcc -c -o x.o x.c
mipsel-linux-gnu-objcopy --add-section raw=vmlinux x.o
mipsel-linux-gnu-objcopy --remove-section .comment x.o
mipsel-linux-gnu-objdump -D x.o | less

Есть ли более простой способ сделать это?Я пробовал следующее безрезультатно:

mipsel-linux-gnu-objdump -b elf32-tradlittlemips -mmips -Mgpr-names=O32,cp0-names=mips1,cp0-names=mips1,hwr-names=mips1,reg-names=mips1 -D vmlinux | less

Это просто выплевывает:

mipsel-linux-gnu-objdump: vmlinux: File format not recognized

Если это помогает, вот вывод некоторых команд:

$ file x.o
x.o: ELF 32-bit LSB relocatable, MIPS, MIPS-I version 1 (SYSV), with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x1040000, not stripped
$ mipsel-linux-gnu-objdump -p x.o

x.o:     file format elf32-tradlittlemips
private flags = 1006: [abi=O32] [mips1] [not 32bitmode] [PIC] [CPIC]

Целью является процессор AR7.

Ответы [ 3 ]

5 голосов
/ 29 марта 2012

Хм, кажется, проще.-b elf32-tradlittlemips не работает, поскольку файл не является исполняемым файлом ELF, а является двоичным.Таким образом, правильный вариант для использования - -b binary.Другая опция, -mmips, заставляет objdump распознавать файл как двоичный файл для MIPS.Поскольку целевая машина имеет младший порядок байтов, мне также пришлось добавить -EL, чтобы вывод совпадал с выводом для x.o.

-mmips включает только базовый набор команд.AR7 имеет процессор MIPS32, который имеет больше команд , чем просто MIPS.Чтобы декодировать эти новые инструкции MIPS32, используйте -mmips:isa32.Список доступных ISA можно перечислить с помощью objdump -i -m.

Последняя команда становится такой:

mipsel-linux-gnu-objdump -b binary -mmips:isa32 -EL -D vmlinux

. Здесь будут отображаться регистры типа $3 вместо их имен.Чтобы настроить это, я использовал следующие дополнительные опции, которые упомянуты в mipsel-linux-gnu-objdump --help:

-Mgpr-names=32,cp0-names=mips32,cp0-names=mips32,hwr-names=mips32,reg-names=mips32

, которые я выбрал для mips32 после прочтения:

0 голосов
/ 02 августа 2013

Используйте ODA, онлайн-дизассемблер:

http://www.onlinedisassembler.com

0 голосов
/ 29 марта 2012

??? Что не так с просто:

mipsel-linux-gnu-gcc -c -o x.o x.c
mipsel-linux-gnu-objdump -D x.o

Проблема в том, что -D разбирает все разделы, код или нет? Используйте -d тогда. Или -S, чтобы показать сборку с чередованием с источником (подразумевается -d).

или как получить код сборки из gcc:

mipsel-linux-gnu-gcc -S x.c
...