Wer ein Betriebssystem (oder generell Applikationen) für auf ARM-Prozessoren basierenden Architekturen erstellen will, aber selber nicht auf einer solchen entwickelt, muss sich einen Cross-Compiler erstellen bzw. verwenden. In diesem Artikel wird erklärt, wie ein Cross-Compiler unter Linux für die ARM-Architektur erstellt wird.
== Vorbereitungen ==
Die Erstellung eines Cross-Compilers für ARM-Architekturen erfolgt anfangs analog zu der Erstellung eines [[X86-64_Cross-Compiler|Cross-Compilers]] für [[X86-64|x86-64 Prozessoren]]: Es müssen die [http://ftp.gnu.org/gnu/binutils/binutils-2.20.tar.gz binutils] und der [http://ftp.gnu.org/gnu/gcc/gcc-4.4.2/gcc-core-4.4.2.tar.bz2 gcc] in ihrer jeweils aktuellen Version (Stand: 09. November 2009) heruntergeladen werden. Sollen mehr Sprachen als C unterstützt werden, so müssen die entsprechenden Pakete unter [http://ftp.gnu.org/gnu/gcc] heruntergeladen werden.
Es werden nun ein paar Variablen erstellt:
$ export PREFIX=/usr/cross/arm
$ export TARGET=arm-unknown-linux-gnu
Der Pfad unter PREFIX kann geändert werden, wenn die Cross-Tools an anderer Stelle compilliert werden sollen.
== binutils bauen ==
Sofern nicht schon geschehen, sollte man jetzt das binutils-Paket entpacken, in diesem Beispiel werden die binutils nach ''/usr/src/cross-arm-binutils'' entpackt. Nun sollte ein separates Verzeichnis erstellt werden, in welchem die binutils gebaut werden, in unserem Beispiel ist das ''/usr/src/binutils-arm''. Nun wechselt man in eben dieses Verzeichnis und ruft configure wie folgt auf:
$ ../cross-arm-binutils/configure --target=$TARGET --prefix=$PREFIX
Nach erfolgreichem configure können die binutils nun gebaut werden mittels
$ make all
# make install
=== Fehler beim Bauen ===
Unter Ubuntu kann es passieren, dass make nicht reibungslos durchläuft und mit einem Fehler abbricht:
cc1: warnings being treated as errors
../../cross-arm-binutils/gas/config/tc-arm.c: In function ‘make_mapping_symbol’:
../../cross-arm-binutils/gas/config/tc-arm.c:2489: error: suggest braces around empty body in an ‘if’ statement
Hier hilft entweder das Entfernen des Compiler-Flags "-Werror" oder man editiert die Datei via
$ vim ../cross-arm-binutils/gas/config/tc-arm.c
und schreibt nach dem if-Statement in Zeile '''2489''' zwei Klammern:
'''Vorher'''
2489 if (frag->tc_frag_data.last_map != NULL)
2490 know (S_GET_VALUE (frag->tc_frag_data.last_map) < S_GET_VALUE (symbolP));
2491 frag->tc_frag_data.last_map = symbolP;
'''Nachher'''
2488 if (frag->tc_frag_data.last_map != NULL)
2489 {
2490 know (S_GET_VALUE (frag->tc_frag_data.last_map) < S_GET_VALUE (symbolP));
2491 }
2492
2493 frag->tc_frag_data.last_map = symbolP;
== gcc bauen ==
Nun geht's an den gcc: Hier gilt auch wieder, sofern nicht schon geschehen, den gcc zu entpacken, in diesem Beispiel nach ''/usr/src/cross-arm-gcc''. Nun sollte, genau wie bei den binutils, ein separates Verzeichnis erstellt werden, in welchem der gcc gebaut wird, in unserem Beispiel ist das ''/usr/src/gcc-arm''. Nun wechselt man in eben dieses Verzeichnis und setzt erst den neuen Pfad zu den ARM-binutils:
$ export PATH=$PATH:$PREFIX/bin
Dann ruft man configure wie folgt auf:
$ ../cross-arm-gcc/gcc-4.4.2/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --without-headers
Nach erfolgreichem configure kann der gcc mittels
$ make all-gcc
# make install-gcc
gebaut und installiert werden.
=== Fehler beim configure ===
Eventuell kann es sein, dass configure mit der Fehlermeldung abbricht, dass die Libraries '''GMP''' und/oder '''MPFR''' nicht installiert seien. Diese müssen dann per Paketverwaltung oder von Hand installiert werden. [ftp://ftp.gmplib.org/pub/gmp-4.3.1/gmp-4.3.1.tar.bz2 Hier] kann GMP und [http://www.mpfr.org/mpfr-current/mpfr-2.4.1.tar.bz2 hier] MPFR heruntergeladen werden, falls selbige nicht über die Paketverwaltung der Distribution erhältlich sind. Gebaut werden beide mit dem in Linux bekannten Dreisatz ''./configure, make, make install''.
== Fertig! ==
Wenn alles geklappt hat, wurde nun ein Cross-Compiler für ARM-Architekturen erstellt. Die Tools befinden sich (im Beispiel dieses Artikels) unter ''/usr/cross/arm''.
== Siehe auch ==
* [[Cross-Compiler|Cross-Compiler]]
* [[X86-64_Cross-Compiler|Cross-Compiler für x86-64-Systeme]]
* [[Crosscompiler_für_Windows|Cross-Compiler für Windows (erzeugt ELF-Dateien)]]
[[Kategorie:ARM]]
[[Kategorie:Compiler]]
[[Kategorie:Tutorials]]