2012-03-28 11 views
3

Ähnlich wie How do I disassemble raw x86 code?, aber dann für die MIPS-Architektur: Wie zerlege ich rohen MIPS-Code mit objdump? Ich mag die Anweisungen in einem vmlinux Bild überprüfen, aber ich jetzt zu tun, also müssen:Wie zerlege ich rohen MIPS-Code?

: > 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 

Gibt es einen einfacheren Weg, es zu tun? Ich habe die unten ohne Erfolg versucht:

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 

Es spuckt gerade aus:

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

Wenn es hilft, ist hier der Ausgang einiger Befehle:

$ 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] 

Ziel ist eine AR7 CPU.

Antwort

4

Hmm, scheint es einfacher als das. -b elf32-tradlittlemips funktioniert nicht, da die Datei keine ausführbare ELF-Datei ist, sondern binär. Die richtige Option ist also -b binary. Mit der anderen Option -mmips erkennt objdump die Datei als Binärdatei für MIPS. Da die Zielmaschine Little Endian ist, musste ich auch -EL hinzufügen, damit die Ausgabe mit der Ausgabe für x.o übereinstimmt.

-mmips enthält nur den grundlegenden Befehlssatz. Der AR7 hat einen MIPS32-Prozessor, der has more instructions als nur Mips. Verwenden Sie zum Dekodieren dieser neueren MIPS32-Anweisungen -mmips:isa32. Eine Liste verfügbarer ISAs kann mit objdump -i -m aufgelistet werden.

Der letzte Befehl wird:

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

Dieses Register wie $3 statt ihrer Namen zeigen würde. Einzustellen, dass verwenden ich die nächsten zusätzliche Optionen, die in mipsel-linux-gnu-objdump --help genannt:

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

ich für mips32 wählte nach der Lektüre:

0

??? Was ist los mit nur:

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

das Problem, dass -D diassembles alle Abschnitte, Code oder nicht? Verwenden Sie dann -d. Oder -S, um die Assembly interleaved mit der Quelle anzuzeigen (impliziert -d).

oder wie etwa den Assembler-Code von gcc erhalten:

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

vmlinux enthält keine Abschnitte, es enthält nur Anweisungen. Das Problem ist, ich habe die gcc und objcopy Tools nicht installiert, nur in einer VM.Da es einen Weg gab, objdump den gcc/objcopy-Pfad in x86 überspringe, fragte ich mich, ob es auch auf Mips möglich ist. – Lekensteyn

+0

Ich sehe; Ihre Objektdatei 'x.o' ist nur ein Dummy, und Sie ziehen Abschnitte von' vmlinux' ein. Das ist seltsam; Ich konnte "objdump" immer auf 'vmlinux' laufen lassen, für verschiedene Architekturen: MIPS, ARM, ... Was spuckt dieser' mipsel-linux-gnu-objdump' aus, wenn man ihn nur mit '' d vmlinux', ohne diese anderen Argumente? Außerdem: 'file vmlinux'. – Kaz

+0

Datei ergibt 'vmlinux: data' – Lekensteyn

Verwandte Themen