如何反汇编原始MIPS代码?

时间:2012-03-28 21:45:40

标签: linux assembly mips objdump

How do I disassemble raw x86 code?类似,但对于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。

3 个答案:

答案 0 :(得分:4)

嗯,似乎比那更容易。 -b elf32-tradlittlemips不起作用,因为该文件不是ELF可执行文件,而是二进制文件。因此,正确的选项是-b binary。另一个选项-mmips使objdump将文件识别为MIPS的二进制文件。由于目标机器是小端,我还必须添加-EL以使输出与x.o的输出匹配。

-mmips仅包含基本指令集。 AR7有一个MIPS32处理器has more instructions而不仅仅是mips。要解码这些较新的MIPS32指令,请使用-mmips:isa32。可以使用objdump -i -m列出可用的ISA列表。

最终命令变为:

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

答案 1 :(得分:0)

???有什么问题:

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

答案 2 :(得分:0)

使用ODA,在线反汇编程序:

http://www.onlinedisassembler.com