Cygwin Cross-Compiler Howto
Absicht:
Im folgenden möchte ich beschreiben wie man unter cygwin eine cross compiler Toolchain, also compiler, runtime library, assembler, linker and debugger für eine ARM Umgebung erzeugt (z.B. iPAQ/GP32 oder ähnliches).Unter Win2000/XP sollte es keine Probleme geben, jedoch zeigen Erfahrungen, dass cygwin Probleme mit Win95/98 zu haben scheint. Einmal fertig funktioniert der cross-compiler meist tadellos. Sollte es während des kompilierens zu Problemen kommen, gilt das gute alte "restart and retry" und wenn garnix mehr geht hilft das Usenet.
Unter Abbildung 1 finden sie eine Liste der benötigten Programme und die Versionsnummern welche ich verwendet habe, bitte verwenden sie genau diese wenigstens beim ersten mal da es durch Änderungen im Quellcode zu Problemen und veränderten Installationsprozessen kommen kann. Um genau zu sein war genau das der Grund für mich die erste Howto zu tippen, da ich verschiedene Hürden zu nehmen hatte um den GCC 3.2.3 unter cygwin als cross-compiler einzusetzen, bei der neuen Version meiner cross-compiler Howto kommt der GCC 3.4.0 zum Einsatz. Für Fragen und Kritik bin ich nach wie vor jederzeit unter ich@utzwinter.de zu erreichen, desweiteren würde ich mich sehr über einen Gästebucheintrag freuen -> www.utzwinter.de -> Gästebuch oder eine E-Mail freuen.
| binutils-2.10: | http://sources.redhat.com/binutils |
| gcc-3.4.0.tar.gz: | http://gcc.gnu.org |
| newlib-1.12.0: | ftp://sources.redhat.com/pub/newlib/index.html |
| insight 6.1: | http://sources.redhat.com/insight/ |
- In den binutils sind der GNU assembler und Linker enthalten,
- Der GCC liefert die GNU C/C++ compiler.
- Die Newlib ist die C runtime library die wir verwenden um Funktionen wie printf() zur Verfügung zu stellen
- Das Insight Packet stellt den GDB sowie eine Grafische Oberfläche für eben jenen zur Verfügung.
Erstellen der Verzeichnisstruktur:
Als erstes erstellen wir eine Verzeichnisstruktur, in der wir später den cross-compiler generieren, als Prefix(Installationsverzeichnis) verwende ich /usr/cross, als target (Zielarchitektur) arm-elf.
mkdir cross
cd /usr/cross
mkdir build-binutils
mkdir build-gcc
mkdir build-newlib
mkdir build-insight
export TARGET=arm-elf
export PREFIX=/usr/cross
export PATH=$PATH:$PREFIX/bin
Entpacken der Quellen:
Alle Quellen werden in /usr/cross entpackt, so das z.B. die Sources für den Compiler in /usr/cross/gcc-3.4.0/ zu finden sind.
tar xzvf gcc-3.4.0.tar.gz
tar xzvf newlib-1.12.0.tar.gz
tar xzvf insight-6.1.tar.gz
Anwenden der Patches:
In den oben verwendeten Versionen entfällt dieser Schritt, da ich keinerlei Probleme hatte die cross-compiler toolchain zu erstellen
Kompilierung der Binutils:
Die Befehle um den Assembler und Linker zu konfigurieren und Installieren sind unter Abbildung 4 zu finden, sie haben Folgende Aufgaben:
- Aufruf des in den Binutils enthaltenden Konfigurierungs Skriptes um Einstellungen am Quellcode für ein ARM Target vozunehmen
- Mithilfe von make den Quellcode kompilieren und installieren
../binutils-2.10/configure --target=$TARGET --prefix=$PREFIX
make all install
Nach Beendigung des Kompiliervorgangs sind im /usr/cross/bin Verzeichnis folgende Programme zu finden:
- arm-elf-as.exe - Der ARM spezifische Assembler
- arm-elf-ld.exe - Der Linker um Objectfiles zu einem Programm zu verbinden
- arm-elf-objcopy - ein tool um Formate zu konvertieren (z.B. ELF zu a.out)
- arm-elf-objdump - ein tool
Kompilierung eines Bootstrap Compilers
Nachdem wir einen Assembler und Linker haben können wir einen Bootstrap Compiler bauen um die Laufzeitumgebung und Header Dateien zu kompilieren. Nachdem dies geschehen ist können wir einen kompletten Compiler bauen.
../gcc-3.4.0/configure --target=$TARGET --prefix=$PREFIX --with-gnu-as --with-gnu-ld
--enable-languages=c,c++ --with-newlib --without-headers --disable-shared
make all-gcc install-gcc
Danach sollten sie im Verzeichnis /usr/cross/bin die gcc-arm-elf.exe zu finden sein mit der sich die Newlib Laufzeitumgebung kompilieren läßt.
Kompilierung der Newlib:
Same procedure as most of the time ;):
../newlib-1.12.0/configure --target=$TARGET --prefix=$PREFIX
make all install
Kompilierung des kompletten Compilers
Jetzt wo wir sowohl die ARM Header und die libraries haben können wir den kompletten Compiler erstellen.
../gcc-3.4.0/configure --target=$TARGET --prefix=$PREFIX --with-gnu-as --with-gnu-ld
make all install
Kompilierung des Insight Debuggers
Der finale Schritt stellt das Erstellen eines Debuggers für ARM dar, mit dem sich Programme später auf Fehler untersuchen lassen, ich habe mich für den Insight Debugger in der Version 5.3 entschieden, der eine komfortabele graphische Benutzeroberfläche für den gdb zur Verfügung stellt.
../insight-6.1/configure --target=$TARGET --prefix=$PREFIX
make all install
Abschließend...
...möchte ich mich bei allen bedanken die mir bei der Erstellung dieser Howto geholfen haben, seien es mein Chef der mich gebeten hat einen Compiler mit dem gcc-3.2.3 unter cygwin für arm-elf zu basteln was zu Chaos führte, oder meinen lieben MitHiwi´s die meine Wutanfälle ertragen haben und mich bei stundenlangen Kompilierungsvorgängen unterhalten haben.
Darüberhinaus möchte ich mich bei allen entschuldigen die der Meinung sind ich hätte von ihnen Kopiert und sie sollten namentlich erwähnt werden.
Die cross-compiler toolchain die ich zuhause gebaut habe kann ich auf Anfrage evtl auch Online stellen, werde diese jedoch deshalb nicht permanent zum Download anbieten da ich den Traffic den meine Seite produziert überwachen möchte und keine Lust habe am Ende des Monats eine dicke Rechnung von Seiten meines Providers zu erhalten.
mfg Utz Winter