| Zeile 1: | Zeile 1: | ||
| − | 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. | + | 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 == | == 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. | + | 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: | Es werden nun ein paar Variablen erstellt: | ||
| Zeile 10: | Zeile 10: | ||
$ export TARGET=arm-unknown-linux-gnu | $ export TARGET=arm-unknown-linux-gnu | ||
| − | Der Pfad unter PREFIX kann geändert werden, wenn die Cross-Tools | + | Der Pfad unter PREFIX kann geändert werden, wenn die Cross-Tools an anderer Stelle compilliert werden sollen. |
== binutils bauen == | == 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 | + | 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 | $ ../cross-arm-binutils/configure --target=$TARGET --prefix=$PREFIX | ||
| − | Nach erfolgreichem | + | Nach erfolgreichem configure können die binutils nun gebaut werden mittels |
$ make all | $ make all | ||
| Zeile 23: | Zeile 23: | ||
=== Fehler beim Bauen === | === Fehler beim Bauen === | ||
| − | Unter Ubuntu kann es passieren, dass make nicht reibungslos durchläuft und mit einem Fehler die | + | Unter Ubuntu kann es passieren, dass make nicht reibungslos durchläuft und mit einem Fehler die Kompilierung abbricht: |
cc1: warnings being treated as errors | cc1: warnings being treated as errors | ||
| Zeile 33: | Zeile 33: | ||
$ vim ../cross-arm-binutils/gas/config/tc-arm.c | $ vim ../cross-arm-binutils/gas/config/tc-arm.c | ||
| − | + | und schreibt nach dem if-Statement in Zeile '''2489''' zwei Klammern: | |
'''Vorher''' | '''Vorher''' | ||
| Zeile 53: | Zeile 53: | ||
== gcc bauen == | == 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 | + | 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 | $ export PATH=$PATH:$PREFIX/bin | ||
| Zeile 61: | Zeile 61: | ||
$ ../cross-arm-gcc/gcc-4.4.2/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --without-headers | $ ../cross-arm-gcc/gcc-4.4.2/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --without-headers | ||
| − | Nach erfolgreichem configure kann der gcc | + | Nach erfolgreichem configure kann der gcc mittels |
$ make all-gcc | $ make all-gcc | ||
| Zeile 69: | Zeile 69: | ||
=== Fehler beim configure === | === Fehler beim configure === | ||
| − | Eventuell kann es sein, dass configure mit | + | 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! == | == 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''. | + | 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''. |