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. 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 woanders 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 seperates 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, bei dem an und für sich nichts schief gehen sollte, können die binutils nun gebaut werden per $ make all # make install === Fehler beim Bauen === Unter Ubuntu kann es passieren, dass make nicht reibungslos durchläuft und mit einem Fehler die Kompillierung 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 seperates 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 per $ make all-gcc # make install-gcc gebaut und installiert werden. === Fehler beim configure === Eventuell kann es sein, dass configure mit einem Fehler abbricht, die Libraries '''GMP''' und/oder '''MPFR''' seien nicht installiert. 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 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]]