如何反汇编原始MIPS代码?

Lek*_*eyn 4 linux assembly mips objdump

类似于我如何反汇编原始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
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?我尝试了以下无济于事:

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
Run Code Online (Sandbox Code Playgroud)

它只是吐出来:

mipsel-linux-gnu-objdump: vmlinux: File format not recognized
Run Code Online (Sandbox Code Playgroud)

如果有帮助,这是一些命令的输出:

$ 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]
Run Code Online (Sandbox Code Playgroud)

目标是AR7 CPU。

Lek*_*eyn 5

嗯,似乎比这容易。-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
Run Code Online (Sandbox Code Playgroud)

这会显示类似的寄存器,$3而不是其名称。为了对此进行调整,我使用了以下其他选项mipsel-linux-gnu-objdump --help

-Mgpr-names=32,cp0-names=mips32,cp0-names=mips32,hwr-names=mips32,reg-names=mips32
Run Code Online (Sandbox Code Playgroud)

我选择mips32阅读后: