This article is part of a series: Jump to series overview

Wenn man auf seinem eigenen System einen Quelltext kompiliert, so wird dieser üblicherweise gleich für das System kompiliert, auf dem man sich befindet. Der Maschinencode kann dann nur von solchen Computern ausgeführt werden, die den gleichen Maschinenbefehlen folgen.

Um für ein anderes System zu kompilieren, sollte man sich deshalb einen Cross-Compiler erstellen. In früheren Tagen, als alle Heimsysteme noch 32-Bit waren und der 386-Architektur folgten, fiel dies weniger auf. Wenn Kernel-Programmierer heute allerdings zuerst lernen, für die 386-Architektur zu entwickeln und gleichzeitig auf einem 64-Bit-System arbeiten, ist dieser Schritt wichtig.

Eine sehr ausführliche Anleitung zum Bauen eines Cross-Compilers findet sich im OSDev-Wiki. Ich werde mich auch daran orientieren, jedoch nur die wichtigen Schritte beschreiben, die zur Durchführung ausreichen.

Zunächst einmal muss man sich die gewünschten Versionen von binutils und GCC herunterladen. Beim GCC soll man darauf achten, dass die heruntergeladene Version nicht zu sehr von der Version abweicht, mit der man ihn kompilieren will.

Die beiden heruntergeladenen Pakete entpackt man anschließend, z.B. in einen Ordner src.

mkdir $HOME/src
tar xvjf ../path_to_download/binutils-x.y.z.tar.bz2
tar xvjf ../path_to_download/gcc-x.y.z.tar.bz2

Zum Vorbereiten des Vorgangs setzt man sich noch ein paar Umgebungsvariablen. Den Zielpfad der kompilierten Programme (Präfix), die Zielarchitektur und man kann die Pfadvariable um das Präfix erweitern (sofern man denn will).

export PREFIX="$HOME/opt/cross"
export TARGET=i586-elf
export PATH="$PREFIX/bin:$PATH"

Da die Dateien unter $HOME/opt/cross abgelegt werden sollen, sollte man diesen Ordner auch anlegen:

mkdir -p $HOME/opt/cross

Anschließend wechselt man in das Verzeichnis, wo man binutils entpackt hat und kompiliert dieses. Durch Angabe des Präfixes, wird es beim Aufruf von make install an die richtige Stelle kopiert.

cd $HOME/src
./binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls
make
make install

Ähnlich kompiliert man auch den GCC:

cd $HOME/src
./gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc

Und schon kann man auch auf einem 64-Bit-System für 32-Bit kompilieren.

I do not maintain a comments section. If you have any questions or comments regarding my posts, please do not hesitate to send me an e-mail to blog@stefan-koch.name.