Linux 如何反汇编原始MIPS代码?

Linux 如何反汇编原始MIPS代码?,linux,assembly,mips,objdump,Linux,Assembly,Mips,Objdump,与类似,但对于MIPS体系结构:如何使用objdump反汇编原始MIPS代码?我想检查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-objdu

与类似,但对于MIPS体系结构:如何使用
objdump
反汇编原始MIPS代码?我想检查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 CPU。

???这有什么不对呢

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

嗯,看起来比那容易<代码>-b elf32 tradlittlemips无法工作,因为该文件不是ELF可执行文件,而是二进制文件。因此,要使用的正确选项是
-b binary
。另一个选项,
-mmips
使objdump将文件识别为MIPS的二进制文件。由于目标机器是little endian,我还必须添加
-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
选择了:


使用在线拆卸器ODA:


vmlinux不包含任何部分,它仅包含说明。问题是,我没有安装gcc和objcopy工具,只在VM中安装。因为有一种方法可以让objdump跳过x86中的gcc/objcopy路径,所以我想知道在mips上是否也可以这样做;您的对象文件
x.o
只是一个虚拟文件,您正在从
vmlinux
中提取部分。这很奇怪;我一直能够在
vmlinux
上运行
objdump
,用于各种架构:MIPS、ARM。。。如果您仅使用
-d vmlinux
调用它,而不使用其他参数,那么
mipsel-linux-gnu-objdump
会吐出什么?另外:
文件vmlinux
。ODA将文件大小限制为仅上传256KB。而且,它的web界面也不是很直观。