5 Stimmen

Ermitteln der Ladeadresse und des Einstiegspunkts des gestrippten Linux-Kernel-Images

Ich habe eine Crosscompiling-Toolchain für ein eingebettetes System (Mipsel) auf meinem x86-Linux. Ich weiß, wie ich einen benutzerdefinierten Kernel (nennen wir das Image "vmlinux") für dieses System erstellen kann und wie ich dieses Image über

objcopy -S -O binary vmlinux vmlinux.bin

Für die weitere Verarbeitung benötige ich auch die Ladeadresse und den Eintrittspunkt des Bildes. Vor Abisolieren ist es kein Problem, sie über scripts/mksysmap oder, genauer gesagt, über

nm -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > System.map

Dann kann ich die Ladeadresse und den Einstiegspunkt über

awk '/A _text/ { print "0x"$1; }' < _System.map
awk '/T kernel_entry/ { print "0x"$1; }' < System.map

Die Herausforderung besteht nun darin, dass ich den Kernel manchmal nicht selbst baue, sondern einen vorgefertigten Kernel bekomme nach die Symbole wurden bereits über objcopy . Kann mir jemand sagen, wie man das macht? Ich bin nicht sehr bewandert in der Erstellung von Kerneln und der Verwendung von Toolchains. Beide nm y objdump mögen das gestrichene Bild nicht und sagen

vmlinux.bin: File format not recognized

1voto

sessyargc.jp Punkte 573

Von der objcopy Handbuchseite

objcopy kann verwendet werden, um eine rohe Binärdatei zu erzeugen, indem ein Ausgabeziel von binary verwendet wird (z. B. mit -O binär ). Wenn objcopy eine rohe Binärdatei erzeugt, erzeugt es im Wesentlichen einen Speicherauszug des Inhalts der Eingabeobjektdatei. Alle Symbole und Relocation-Informationen werden verworfen. Der Speicherauszug beginnt an der virtuellen Adresse des niedrigsten Abschnitts, der in die Ausgabedatei kopiert wurde.

Hier ist ein Beispiel, das auf der PowerPC-Architektur verwendet werden könnte:

original vmlinux

bash-3.2$ file vmlinux
vmlinux: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped

stripped vmlinux wird als "Daten"-Datei betrachtet

bash-3.2$ file vmlinux.bin
vmlinux.bin: data

Konvertierung von Binärdaten in das ELF-Format für den PowerPC

bash-3.2$ powerpc-440fp-linux-objcopy -I binary vmlinux.bin -B powerpc -O elf32-powerpc vmlinux.bin.x

Die Ausgabe von vmlinux wird nun als ELF-Datei betrachtet

bash-3.2$ file vmlinux.bin.x
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped

Sie müssen die -I , -B y -O Parameter. Sie können diese Parameter aus Ihrer objcopy-Dokumentation entnehmen.

Da Ihre Binärdatei aber bereits gestrippt ist, lohnt sich der Versuch der Dekompilierung möglicherweise nicht, da die Abschnittsinformationen nicht verfügbar sind. Alle Daten in der Datei werden in die Sektion .data ausgelagert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X