ACHTUNG! Es besteht Grund zur Annahme, dass diese Anleitung nicht funktioniert, besser gesagt, dass GCC 4.3 fuer uns nicht funktioniert!
Development Toolchain für Ubuntu 8.10 Intrepid Ibex
Die nachfolgende Anleitung habe ich hauptsächlich mit der Absicht geschrieben, die Schritte für die Einrichtung der ARM/AVR Toolchain später nachvollziehen zu können, beispielsweise bei einem Update auf eine neuere Version oder der Installation auf einem anderen Computer. Damit auch andere davon profitieren können, habe ich sie allerdings möglichst ausführlich geschrieben. Die Anleitung bezieht sich auf die Linux Distribution Ubuntu in der Version 8.10 und berücksichtigt Dependencies, welche beim Kompilieren der Toolchain zu Fehlern führen, weil die entsprechenden Pakete bei Ubuntu nicht standardmässig installiert sind. Fehlende Pakete können entweder mit dem grafischen Paket- Manager Synaptic (Toolbar: System/Administration/Synaptic Package Manager) oder über die Shell mittels apt-get installiert werden:
# apt-cache search [expression]
# sudo apt-get install [package-name]
Damit überhaupt Programme für Ubuntu kompiliert werden können, muss das Metapaket build-essential zwingend installiert sein.
Die arm-elf- Toolchain
Zunächst die arm-elf Toolchain: Wir beginnen mit der Einrichtung eines temp- Verzeichnis im eigenen Home- Folder, wo wir anschliesend alle heruntergeladenen Pakete ablegen und kompilieren.
# cd ~ mkdir -p temp/arm-elf/src cd temp/arm-elf/src/
Nun müssen wir die Source- Tarballs für die Toolchain downloaden. Die arm-elf Toolchain besteht aus den folgenden Paketen. Die Versionsnummern sind die aktuellsten zum Zeitpunkt der Erstellung dieses Artikels.
GCC 4.3.2: ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.3.2/gcc-4.3.2.tar.bz2
Binutils 2.19: ftp://gcc.gnu.org/pub/binutils/releases/binutils-2.19.tar.bz2
Newlib 1.17: ftp://gcc.gnu.org/pub/newlib/newlib-1.17.0.tar.gz
Insight 6.8: ftp://gcc.gnu.org/pub/insight/releases/insight-6.8.tar.bz2
Zum Downloaden verwenden wir wget in der Shell:
# wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.3.2/gcc-4.3.2.tar.bz2
# wget ftp://gcc.gnu.org/pub/binutils/releases/binutils-2.19.tar.bz2
# wget ftp://gcc.gnu.org/pub/insight/releases/insight-6.8.tar.bz2
Anschliessend entpacken wir die Archive:
# tar -xjf gcc-4.3.2.tar.bz2
# tar -xjf binutils-2.19.tar.bz2
# tar -xzf newlib-1.17.0.tar.gz
# tar -xjf insight-6.8.tar.bz2
Damit wir nachher nicht immer den gesamten Installationspfad und die Ziel- Architektur angeben müssen, erstellen wir uns ein paar Variablen für diesen Zweck. Weil diese allerdings anschliessend keine Gültigkeit für Befehle mit vorangestelltem sudo hätten, arbeiten wir aber hier in einer Root- Shell. Wir erweitern die PATH Variable temporär. Ganz zum Ende dieser Anleitung, wenn alle Toolchains installiert sind, werden wir diese Änderungen noch fix machen.
# sudo -s
# export target=arm-elf
# export prefix=/usr/local/$target
# mkdir -p $prefix/bin
# export PATH=$prefix/bin:$PATH
Zum Kompilieren der Toolchain erstellen wir jetzt passende Build- Verzeichnisse.
# cd ~/temp/arm-elf
# mkdir -p build/binutils-2.19 build/gcc-4.3.2 build/newlib-1.17.0 build/insight-6.8
Nun gehts los
Wir beginnen mit den Binutils, welche beispielsweise den Linker enthalten. Das --disable-werror Flag wird benötigt, weil Ubuntu seit 8.10 standardmässig das -Wformat=2 Flag gesetzt hat, um sogenannten Format- String Angriffen vorzubeugen, was in unserem Fall allerdings dazu führen würde, dass der Kompilier- Vorgang abgebrochen wird. Wer es ganz sauber möchte, sollte die entsprechenden Patches verwenden. Einen Hinweis dazu findet man hier: hier
Bei einem frisch installierten Ubuntu kann der Kompiliervorgang mit einer Fehlermeldung abbrechen, die auf ein fehlendes makeinfo hinweist. In diesem Fall muss das Paket texinfo über Synaptic oder apt-get nachinstalliert werden.
# cd build/binutils-2.19
# ../../src/binutils-2.19/configure --prefix=$prefix --target=$target --enable-interwork --enable-multilib --with-float=soft --disable-werror
# make all install
Als nächstes kommt GCC dran. Damit der GCC kompiliert werden kann, müssen GMP (Gnu multiple-precision arithmetic library) und MPFR (multiple-precision floating-point computations with correct rounding) inklusive Header Files installiert sein. Pakete, welche zusätzlich zu den Binaries auch die Header Files beinhalten, heissen in Ubuntu [package]-dev. In unserem Fall benötigen wir die Pakete libgmp3-dev (+ libgmpxx4ldbl) sowie libmpfr-dev.
Bevor wir kompilieren, müssen wir allerdings noch zwei kleine Veränderungen an den GCC Source Files vornehmen. Damit können später auch Projekte mit gemischtem ARM- und Thumb- Code übersetzt werden. Zum Editieren verwenden wir als Editor nano.
# cd ~/temp/arm-elf nano src/gcc-4.3.2/gcc/config/arm/t-arm-elf
Wir suchen die folgenden beiden Zeilen...
MULTILIB_OPTIONS = marm/mthumb
MULTILIB_DIRNAMES = arm thumb
...und ergänzen diese folgendermassen:
MULTILIB_OPTIONS = marm/mthumb mno-thumb-interwork/mthumb-interwork
MULTILIB_DIRNAMES = arm thumb normal interwork
Wir speichern mit Ctrl - o und verlassen nano mit Ctrl - c.
Um GCC vollständig kompilieren zu können, benötigen wir eine bereits kompilierte Newlib. Diese benötigt ihrerseits aber wieder einen kompilierten GCC. Um dieses Henne- Ei- Problem zu lösen, erstellen wir uns zunächst einen Bootstrap- Compiler, der nur die Newlib- Header Files benötigt. Die Option --disable-nls deaktiviert den "native language support". Wer eine deutschsprachige Ubuntu- Version hat und auch die Fehlermeldungen des GCC später in Deutsch möchte, sollte diese Option weglassen. Allerdings kann es dann Probleme geben, wenn man Eclipse verwenden möchte, weil Fehlermeldungen auf Deutsch den internen Parser durcheinanderbringen.
# cd build/gcc-4.3.2
# ../../src/gcc-4.3.2/configure --target=$target --prefix=$prefix --enable-interwork --enable-multilib --with-float=soft --disable-werror --enable-languages=”c,c++” --with-newlib --with-headers=~/temp/arm-elf/src/newlib-1.17.0/newlib/libc/include --disable-nls
# make all-gcc install-gcc
Weiter gehts mit der Newlib. Die Configure- Option --disable-newlib-supplied-syscalls ist sehr wichtig, da die entsprechenden Syscall- Funktionen im NG Code neu definiert werden. Wären diese schon in der Newlib selbst vorhanden, dann würde anschliessend das Kompilieren des NG Source mit einer Fehlermeldung abbrechen oder zumindest Warnungen ausgeben.
# cd ~/temp/arm-elf/build/newlib-1.17.0
# ../../src/newlib-1.17.0/configure --target=$target --prefix=$prefix --enable-interwork --enable-multilib --with-float=soft --disable-newlib-supplied-syscalls --disable-werror
# make all install
Und nun können wir GCC vollständig kompilieren.
# cd ~/temp/arm-elf/build/gcc-4.3.2
# make all install
Als letztes fehlt in unserer Toolchain noch der Insight Debugger, welcher uns als grafisches Frontend zu gdb später hilfreiche Dienste leisten kann. Damit der Kompiliervorgang funktioniert, müssen die Pakete libx11-dev sowie libncurses5-dev vorhanden sein.
# cd ~temp/arm-elf/build/insight-6.8
# ../../src/insight-6.8/configure --target=$target --prefix=$prefix --enable-interwork --enable-multilib --with-float=soft --disable-werror
# make all install
Quellen: Diese Anleitung basiert auf folgenden Websites:
http://www.madox.net/blog/2008/11/26/compiling-a-toolchain-for-arm7-under-ubuntu/
http://triggeredupdates.wordpress.com/2008/11/10/gnuarm-toolchain-unter-ubuntu-810/
Kurz bevor ich mit diesem ersten Teil der Anleitung fertig geworden bin, habe ich dann noch das hier gefunden
:
