Linux-Kernel crosscompilieren

Wird der Linux-Kernel aus den Quellen übersetzt, wo wird als Zielplattform automatisch die ausgewählt, auf der der Compiliervorgang ausgeführt wird. Compiliert man den Kernel auf einer einem normalen PC mit einer modernen Intel CPU, so wird ein x86-64 oder x86-32 Binary erstellt. Möchten wir aber den Kernel auf einem Embedded System mit einem PowerPC oder ARM Prozessor verwenden, so muss die Kernel-Build-Konfiguration entsprechend eingerichtet werden. Dazu ist eine sogenannte Cross-Toolchain notwendig. Dafür kann unter Debian-basierenden Systemen z.B. die Emdebian-Toolchain verwendet werden.

Nachfolgend sind die Befehle aufgelistet, die für einen solchen Cross-Build benötigt werden. In diesem Beispiel wird von der Emdebian Toolchain ausgegangen. Wie diese Cross-Toolchain installiert wird, ist hier zu finden.

  1. gewünschten Kernel von http://kernel.org herunterladen und entpacken
  2. Konsole öffnen und in den vorher entpackten Kernel-Sourcecode navigieren
  3. Im Hauptverzeichnis des Kernels ausführen von:
    make clean 
  4. Falls schon eine Kernel-Config besteht, kann diese übernommen werden und für das nachfolgende Compilieren bereitgestellt werden.
    cp /path/to/my/config .config

    Wobei .config die bestehende Kernel-Config darstellt, die übernommen werden soll. Häufig ist gibt es ein Makefile-Target, das eine bestehende Konfiguration in einem Verzeichnis (z.B. in arch/powerpc/configs/xxx) kopiert. Dazu muss aber zuerst, wie weiter unten beschrieben, die gewünschte Architektur definiert werden.
    Wenn noch keine Kernel-Config vorhanden ist, muss diese erstellt werden. Dabei ist auszuwählen, was alles an Treibern und Subsystemen in den Kernel aufgenommen werden soll. Dies geschieht durch den Aufruf von

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

    Ist noch keine Konfiguration vorhanden, kann auch mit der Default-Konfiguration gestartet werden.

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig

    Häufig wird eine ältere Konfiguration auch für einen neuen Kernel verwendet. Der neue Kernel hat dann neue Optionen.

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- oldconfig

    Dieser Befehl fragt nur die neuen Optionen ab und speichert das Resultat auch wieder in .config ab.

  5. Kernel crosscompilieren für die gewünschte Fremdarchitektur und den gewünschten Crosscompiler, zum Beispiel ARM:
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

    Alternativ können auch vor dem Aufruf von make die notwendigen Variablen definiert werden mit (hier am Beispiel für eine PPC-Architektur)

    export ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu-
  6. Das erstellte Image ist dann anschliessend im Architektur-Verzeichnis als Image, zImage oder uImage zu finden, in diesem Falle unter ARM:
    KERNELDIR/arch/arm/boot