Änderungen

Wechseln zu: Navigation, Suche

Cross Compiler

203 Bytes hinzugefügt, 16:09, 26. Feb. 2023
Benutzung
=== Schritt 1: Sourcen besorgen ===
Die Sourcen für grep befinden sich auf dem GNU-FTP-Server unter https://ftp.gnu.org/gnu/grep/ - die momentan aktuelle Version ist grep-3.8. Die Sourcen werden von dort heruntergeladen und irgendwo auf der Festplatte der Box entpackt, z.B. unter /media/hdd/build. Ausgepackt wird in der Konsole (z.B. Putty) mit dem tar-Befehl: '''<code>tar xvf grep-3.8.tar.gz'''</code>
=== Schritt 2: Sourcen konfigurieren ===
Mit '''<code>cd grep-3.8''' </code> wird in den ausgpackten Source-Tree gewechselt. Die meisten der heute benutzten Software-Pakete werden mit einem '''<code>configure''' </code> konfiguriert; dieses schaut, ob alle benötigten Komponenten für ein erfolgreiches übersetzen vorhanden sind, und generiert die Makefiles, um das Programm anschließend zu übersetzen.
Um Makefiles benutzen zu können, benötigt man das '''<code>make'''</code>-Programm. Ein fertig übersetztes Programm befindet sich in der Database beim aktuellen GCC für die ARM-Boxen.
Ein erster Versuch, den Cross-Compiler zu benutzen, ist immer, den Aufruf von '''<code>configure''' </code> mit der '''<code>CC'''</code>-Variablen zu testen; es gibt eine Reihe von Umgebungsvariablen, die man auf diese Weise (nicht nur) an das configure-Script weiterreichen kann. Ein paar weitere sind: CXX (c++-Compiler), CFLAGS (Flags für den C-Compiler), CXXFLAGS (Flags für den C++-Compiler)
'''<code>CC=mipsel-oe-linux-gcc ./configure --prefix=/usr'''</code>
Das funktioniert bei '''<code>grep''' </code> nicht, die Fehlermeldung sagt, dass man den Compiler über den Switch '''<code>--host=mipsel-oe-linux''' </code> angeben soll. Das funktioniert. Also zweiter Versuch:
'''<code>./configure --host=mipsel-oe-linux --prefix=/usr'''</code>
Der Switch '''<code>--prefix=/usr''' </code> sagt der Umgebung, dass das fertig übersetzte Programm später nach '''<code>/usr''' </code> installiert werden soll; das bedeutet, dass das Binary unter '''<code>/usr/bin/grep''' </code> installiert wird. Ohne diesen Switch wird normalerweise '''<code>/usr/local''' </code> als Ziel benutzt, und das Binary findet sich später unter '''<code>/usr/local/bin/grep'''</code>.
=== Schritt 3: Compilieren ===
Als nächstes soll das Programm übersetzt werden; dazu wird '''<code>make''' </code> aufgerufen:
'''<code>make'''</code>
Meistens dauert der Configure-Schritt genauso lange wie das eigentliche Übersetzen des Programms. Wenn beim Übersetzen keine Fehler passiert sind, kann das Programm installiert werden.
=== Schritt 4: Installation ===
Ich kontrolliere gerne vor dem installieren, was installiert werden soll. Fast alle Makefiles kennen das "Target" "install", viele können auch mit dem Target "install-strip" umgehen, und viele kennen auch eine Möglichkeit, das Programm in einem anderen Verzeichnis zu installieren. In der Regel wird das mit der Variablen '''<code>DESTDIR''' </code> erreicht. Wir führen also aus:
'''<code>make install-strip DESTDIR=/media/hdd/install'''</code>
Das installiert das übersetzte Programm unterhalb von '''<code>/media/hdd/install'''</code>, wo wir noch einmal schauen können, was wir mitnehmen möchten, und was nicht.
=== Schritt 5: Programm einpacken und testen ===
Der nächste Schritt ist bei mir immer, die Dateien als IPK einzupacken. Wie das gemacht werden kann, soll hier nicht gezeigt werden; dazu habe ich unter [[Paketmanager opkg]] schon einiges geschrieben.
Wir kontrollieren aber noch einmal, dass der Cross-Compiler ein Mipsel-Binary erstellt hat. Dazu wechseln wir in der Konsole mit "cd" nach '''<code>/media/hdd/install/usr/bin'''</code>. Ein '''<code>ls -l''' </code> zeigt hier drei Dateien an, '''<code>egrep'''</code>, '''<code>fgrep''' </code> und '''<code>grep'''</code>. egrep und fgrep sind Shell-Scripten, das eigentliche Binary ist '''<code>grep'''</code>. Wir können uns den Inhalt mit einigen Tools anschauen. Als erstes:
'''<code>file grep'''</code>: Ausgabe sollte sein: '''<code>grep: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.6.32, stripped'''</code>
Schauen wir etwas genauer in das Binary:
'''<code>mipsel-oe-linux-objdump -p grep'''</code>
Hier sehen wir alle interessanten Informationen, zum Beispiel welche Shared-Libraries das Programm in welcher Version auf der Mips-Maschine benötigt.
Das Binary kann jetzt auf eine Mips-Box kopiert werden, um endgültig sicherzustellen, dass wir hier keinen Murks produziert haben.
75
Bearbeitungen

Navigationsmenü