Kernel Cross-Compiling mit Gentoo
Dienstag, 18. August 2009Aus aktuellem Anlass, brauche ich eine ältere Version des Kernels (2.6.24) und diese natürlich nicht für mein amd64-Gentoo-System, sondern für ein i686 openSUSE-System, also hinein in die schwarzen Künste und etwas cross-compiling betreiben.
Gentoo als Source-Distribution ist natürlich bestens dafür geeignet und stellt sich als erstaunlich kooperativ heraus, folgende Schritte sind nötig:
- emerge -av portage-utils crossdev (erstes dürfte wahrscheinlich schon installiert sein)
- crossdev –target $MACHINE-$VENDOR-$KERNEL-$OS (durch die entsprechenden Werte ersetzten, Tabelle forestlen oder im Gentoo Handbuch nachgucken, für meinen Fall: crossdev –target i686-pc-linux-gnu)
- Anschließend müsste es einen compiler i686-pc-linux-gnu geben, einfach mal probieren ob der Befehl gefunden wird …
Zum compilieren des Kernels sind jetzt noch folgende Schritte notwendig:
- export ARCH=”x86″ (kleiner Tipp: Hier ist die Kernel-Architektur gefragt, die sich je nach Version etwas verändern kann, deshalb einfach mal in $Kernelsource/arch nachgucken, was die Version gerade so anbietet)
- export CROSS_COMPILE=”$YOUR_CROSS_COMPILER_HERE” (also in meinem Fall export CROSS_COMPILE=”i686-pc-linux-gnu”)
(Wer will kann das ganze auch in ein eigens angelegtes script packen und z.b. unter /usr/bin speichern, Vorschlag dazu am Ende)
Und jetzt kann wie gewohnt make menuconfig bzw. einfach nur make aufgerufen werden. Bei mir ist allerdings noch folgender Fehler aufgetreten:
arch/x86/boot/boot.h: Assembler messages:
arch/x86/boot/boot.h:112: Error: bad register name `%dil’
make[1]: *** [arch/x86/boot/video.o] Fehler 1
make: *** [bzImage] Fehler 2
Dies liegt jedoch offenbar nicht am Cross-compiler selbst sondern an der Tatsache, das der Kernel älter als der aktuell laufende Kernel ist, ich wurde auf folgenden git-comitt aufmerksam gemacht, der das Problem behebt.
Zum Schluss noch der Hinweis auf das wiedermal recht ausführliche Gentoo-Handbuch, das unter dem Thema Embedded Devices auch zum Thema CC etwas hergibt.
Beispiel für make-script:
#!/bin/sh
exec make ARCH=”x86″ CROSS_COMPILE=”i686-pc-linux-gnu-” INSTALL_MOD_PATH=”${SYSROOT}” “$@”