ARM Cross-Compiler

Aus Lowlevel
Version vom 14. November 2009, 05:30 Uhr von Hartmut (Diskussion | Beiträge) (Ist ja an und für sich mehr ein Tutorial imvho)
Wechseln zu:Navigation,

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 Cross-Compilers für x86-64 Prozessoren: Es müssen die binutils und der 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 [1] 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 <c>

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;

</c>

Nachher <c>

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;

</c>

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. Hier kann GMP und 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