Dies ist eine alte Version des Dokuments!


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

    Auch eine bestehende oder übernommende Konfiguration kann so kontrolliert oder angepasst werden.

  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