How to setup the GNU Arm toolchain on (K)Ubuntu Linux

Hallo Kosi's!
Ich nehme einfach mal an, dass der/die ein oder andere von Euch auch Probleme hat, die GNUArm-toolchain fuer Rechnerarchitektur zum laufen zu bekommen. Da ich es (endlich!) hin bekommen habe, hier mein kleines HowTo:

1. Bemerkungen

Zuerst mal eine schlechte Nachricht: dieses HowTo ist fuer Linux, speziell (K)Ubuntu Gutsy. Wer Cygwin benutzt, sollte im Prinzip in etwa genauso vorgehen koennen. Allerdings koennen die Namen der Abhaengigen Packete da anders heissen.

Da die Binary-Packete von GNU-ARM ziemlich mau sind und in den seltensten Faellen fuer das eigene System funktionieren, wird im Folgenden beschrieben, wie man die GNU-ARM-Toolchain neu fuer den eigenen Rechner kompiliert. Waehrend ich das hier schreibe, lasse ich den gesamten Prozess auf meinem (Ubuntu Feisty) Laptop mitlaufen.

Also dann mal ran an das Teil. Wer sich schon mal die Uebersetzung der GNU-ARM sourcen versucht hat und gescheitert ist (ich hab auch ziemlich lange gebraucht ;) kennt einen Zustand der gemein hin "Dependency Hell" genannt wird - der Kompiler bricht ab mit irgend einer Fehlermeldung nach dem Motto: "XYZ not found". Meistens ist der Grund dafuer, dass bestimmt libraries nicht installiert sind - d.h. die Entwicklungsumgebung ist noch unvollstaendig. An der Frage welche packete jetzt noch fehlen duerften die Meisten verzweifelt und gescheitert sein.

2. Vorbereitung: Grundlegende Bash-Befehle

Nun kennt sich vielleicht nicht jeder mit der "Bash" (= Linux Kommandozeile) sonderlich aus. Da ich der Meinung bin, mann sollte manchmal lieber etwas zuviel als zuwenig schreiben, gebe ich an dieser Stelle mal eine kurze (und bei weitem hoechst unvollstaendige) Beschreibung der Befehle die wir im Folgenden brauchen werden.


Wer es genauer wissen will, dem sei "man befehl" ans Herz gelegt. Wie es immer so schoen heisst: "RTFM!" :)

3. Installieren der Abhaengigkeiten

Genug gequacksalbert, jetzt gehts endlich los.
Zuerst erstellen wir uns ein Arbeitsverzeichnis:

mkdir ~/arm-elf-toolchain

und wechseln in eben dieses Verzeichnis:

cd ~/arm-elf-toolchain

"~" steht fuer den Pfad zum home-Verzeichnis des aktuellen Users.

Als naechstes laden wir uns die sourcen von GnuArm runter

  1. wget http://www.gnuarm.com/binutils-2.17.tar.bz2
  2. wget http://www.gnuarm.com/gcc-4.1.1.tar.bz2
  3. wget http://www.gnuarm.com/newlib-1.14.0.tar.gz
  4. wget http://www.gnuarm.com/insight-6.5.tar.bz2
  5. wget http://ftp.gnu.org/gnu/gdb/gdb-6.7.tar.bz2

Letzteres steht leider nicht in der Anleitung von GNUArm.... tsts...
Wenn "wget" noch nicht da ist mit sudo apt-get install wget nachholen.

... und entpacken diese...(nebenbei: mit "TAB" kann man Pfade vervollstaendigen)
  1. tar -xvjf binutils-2.17.tar.bz2
  2. tar -xvjf gcc-4.1.1.tar.bz2
  3. tar -xvzf newlib-1.14.0.tar.gz
  4. tar -xvjf insight-6.5.tar.bz2
  5. tar -xvjf gdb-6.7.tar.bz2

Dann erstellen wir uns noch ein paar Verzeichnisse in denen wir dann "herumkompilieren"
  1. mkdir build-binutils
  2. mkdir build-gcc
  3. mkdir build-newlib
  4. mkdir build-insight
  5. mkdir build-gdb

Jetzt kommt der wichtigste Schritt. Packete installieren. Hoffentlich bekomme ich noch alle zusammen *g*. Bei cygwin kann es passieren, dass die Dinger anders heissen, aber zumindest koennt ihr abschaetzen was alles gebraucht wird. Prinzipiell ist es immer gut die "dev" packete mit zu installieren....
  1. sudo apt-get update
    Laedt die neuesten packet quellen (fuer apt) herunter. Wir wollen doch immer auf dem Laufenden sein, oder?
  2. sudo aptitude install build-essential
    Ubuntu's apt-get kennt dieses Packet, aus welchem versc**** Grund auch immer nicht. aptitude aber schon.... *nerv*. Hiermit sollte schon mal ein ganzer Haufen Abhaengigkeiten erschlagen sein. In "build-essential" sind die ueblichen Verdaechtigen wie "make" "gcc" etc drin.
  3. sudo apt-get install libx11-6 libx11-dev
    insight hat ja eine graphische Oberflaeche und benutzt dafuer die X11-widgets.
  4. sudo apt-get install texinfo flex bison
  5. sudo apt-get install libncurses5-dev libncursesw5-dbg libncursesw5-dev libncurses5 libncurses5-dbg libncursesw5 libncurses4
    Man braucht vielleicht nicht alle hiervon, aber konflikte gab's bei mir nicht, deshalb als druff mit allem was "ncurses" heisst. Braucht man so ziemlich immer wenn man was kompilieren will.
  6. sudo apt-get install libnewlib-dev libnewlib-headers
  7. sudo apt-get install zlibc
    Um libraries zu entpacken. Bin mit nicht ganz sicher, ob wir das hierfuer brauchen, aber spaetestens bei naechsten mal ist zlib faellig.

Und Action...!

Jetzt schaun wir mal ob's klappt, hehe....
  1. cd build-binutils
  2. ../binutils-2.17/configure --target=arm-elf --prefix=/usr/local/arm7/ --enable-interwork --enable-multilib
  3. sudo make all install
So. Auf meinem Laptop hat bis hier hin alles geklappt. Hoffe Ihr hattet auch soviel Glueck :) ! Wenn Euch bei einem solchen Dreisatz mal ein Fehler passiert: einfach sudo make clean aufrufen. Das entfernt die Rueckstaende des letzten Versuchs. Wenn make dabei einen Fehler ala "cannot remove ..." ausspuckt hilft auch die Rabiate Methode: sudo rm -r *. Vorsicht, "rm" ist sehr eifrig und fragt nicht nach, im falschen Verzeichnis ausgefuehrt uns dann ist Sense!

Als naechstes muessen wir die eben gebauten binutils den anderen build-scripten zur Verfuegung stellen. Also:
  1. export PATH=$PATH:/usr/local/arm7/bin
    Damit das auch dauerhaft so bleibt, schreiben wir das auch gleich in ~/.bashrc rein.
Jetzt noch ein kleiner Trick! der gcc (war das glaub ich...sry) beschwert sich bei mir (trotz des export) darueber, dass er "arm-elf-ar" sowie "arm-elf-ranlib" nicht findet. liegt daran dass wenn wir mit sudo zum root account wechseln, der export wieder floeten geht (root hat seinen eigenen PATH). Wenn wir am Ende (endlich!) unsere RA-Aufgaben uebersetzen wollen fehlt ausserdem ploetzlich der "ld" (linker). Der ist zwar da, heisst aber "arm-elf-ld". Diese Probleme beheben wir einfach mit einem symbolischen Link auf "/usr/bin" (ist im standard PATH drin). Da hat das Teil doch glatt versucht mich zu verkackeiern :D
also: simsalabim:
  1. sudo ln -s /usr/local/arm7/bin/arm-elf-ar /usr/bin/arm-elf-ar
    anschliessend (just in case) die Datei Rechte fuer den Link setzen:
  2. sudo chmod a+x /usr/bin/arm-elf-ar
  3. sudo ln -s /usr/local/arm7/bin/arm-elf-ranlib /usr/bin/arm-elf-ranlib
  4. sudo chmod a+x /usr/bin/arm-elf-ranlib
  5. sudo ln -s /usr/local/arm7/bin/arm-elf-ld /usr/local/arm7/bin/ld
  6. sudo chmod a+x /usr/local/arm7/bin/ld
So das haetten wir. Als naechstes waere dann der gcc dran, das alte Ekel...
  1. cd ../build-gcc
  2. sudo ../gcc-4.1.1/configure --target=arm-elf --prefix=/usr/local/arm7/ --enable-interwork --enable-multilib --enable-languages="c,c++" --with-newlib --with-headers=../newlib-1.14.0/newlib/libc/include/
  3. sudo make all-gcc install-gcc
Hm. zugegeben, das hat mein Laptop auch nicht gleich gemacht *g*. Hat sich beschwert weil "stdio.h" etc nicht da ist... (StandardLibrary? spinnt der komplett?). Deshalb "configure" mit root-Rechten ausfuehren. Dann gings.... So. Meiner Meinung war das das haertest Stueck Arbeit. Herzlichen Glueckwunsch! Wenn Ihr noch andere Fehlermeldungen bekommt, checkt erst mal, ob Ihr auch keine Schreibfehler gemacht habt (ja, logo, schon klar :), vergesst nicht prefix-pfade mit "/" abzuschliessen! (--prefix=/usr/local/arm7/). Ansonsten kann man bei Verdacht mit sudo apt-cache search xyz nach weiteren packeten suchen und die dann, Ihr wisst's schon, mit sudo apt-get install blah,blah... ach was red ich. Erst mal ein Kaeffchen... Ach uebrigens: wer es bis hierhin geschafft hat, hat es so gut wie hinter sich! Nur keine Muedigkeit, KOSIs!

So, jetzt die "newlib". make moechte gerne den neuen arm-elf-gcc benutzen. Also sorgen wir dafuer, dass das auch geht.
  1. sudo ln -s /usr/local/arm7/bin/arm-elf-gcc /usr/bin/arm-elf-gcc
  2. sudo ln -s /usr/local/arm7/bin/arm-elf-gcc /usr/bin/arm-elf-cc
Und dann ab gehts mit dem ueblichen Dreisatz:
  1. cd ../build-newlib
  2. ../newlib-1.14.0/configure --target=arm-elf --prefix=/usr/local/arm7/ --enable-interwork --enable-multilib
  3. sudo make all install
Das war einfach oder? Ihr Koenner! Jetzt nochmal den GCC durchroedeln lassen. Wieso? - Weil's im Compendium steht (GNUarm-Webseite).
  1. cd ../build-gcc
  2. sudo make all install
Tatsache. Der ist ja schon wieder am Kloppen. Quizzfrage: wieso eigentlich?

*ironie* Naja, wer will sowas schon genau wissen */ironie*. Jetzt fehlt eigentlich nur noch "insight". Der moechte aber erst einen ordentlichen gdb (debugger) haben. Wenn's weiter nichts ist.
  1. cd ../build-gdb
  2. ../gdb-6.7/configure --target=arm-elf --prefix=/usr/local/arm7/ --enable-interwork --enable-multilib
  3. sudo make all install

Endspurt!

Eigentlich brauch ich das ja gar nicht mehr hinschreiben:
  1. cd ../build-insight
  2. ../insight-6.5/configure --target=arm-elf --prefix=/usr/local/arm7/ --enable-interwork --enable-multilib
  3. sudo make all install

Raffius, wir kommen!

Dann will ich jetzt auch wissen, wie die neuen RA-Aufgaben in AS aussehen *lechz*. Na, habt Ihr auch Eure PATH Variable angepasst?
  1. cd ~/Dokumente/h-da/RA/praktikum/termin4
  2. make
  3. arm-elf-insight aufgabe1.elf
Juhu! Es laeuft! ....

Hoffe das hat Euch zumindest ein bisschen geholfen :) Wenn Ihr noch Fragen habt, oder Euch ein Fehler aufgefallen ist, bitte einfach mail an dominik@bogerts.de.

Lieben Gruss
Dominik