5.8. Anpassen der Toolchain

Jetzt, nachdem die temporären C-Bibliotheken installiert sind, wollen wir alle im Rest des Kapitels kompilierten Werkzeuge gegen diese Bibliotheken verlinken. Um das zu erreichen, müssen Sie den Linker und die specs-Datei des Compilers anpassen.

Der am Ende des ersten Durchlaufes von Binutils angepasste Linker muss umbenannt werden, da er sonst nicht korrekt gefunden und benutzt wird. Sichern Sie zunächst den ursprünglichen Linker, dann ersetzen Sie ihn durch den angepassten. Außerdem erzeugen Sie eine Verknüpfung auf das Gegenstück in /tools/$(gcc - dumpmachine)/bin:

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

Von diesem Punkt an wird alles ausschließlich gegen die Bibliotheken in /tools/lib verlinkt.

Der nächste Schritt ist nun, GCC auf den neuen dynamischen Linker zu verweisen. Legen Sie dazu GCCs „specs“-Datei an einem Ort ab, wo GCC standardmäßig sucht. Dann wird der von GCC verwendete dynamische Linker durch einen einfachen sed-Aufruf angepasst.

Es wird empfohlen, das obige Kommando nicht abzuschreiben, sondern mittels Kopieren und Einfügen auszuführen. Sie können die „specs“-Datei auch von Hand ändern: ersetzen Sie einfach jedes Vorkommen von „/lib/ld-linux.so.2“ durch „/tools/lib/ld-linux.so.2“:

[Wichtig]

Wichtig

Wenn Sie mit einer Rechner-Plattform arbeiten, bei der der Name des dynamischen Linkers nicht ld-linux.so.2 lautet, müssen Sie statt „ld-linux.so.2“ den korrekten Namen des Linkers für Ihre Plattform einsetzen. Falls nötig, schauen Sie nochmal im Abschnitt Abschnitt 5.2, „Technische Anmerkungen zur Toolchain“ nach.

gcc -dumpspecs | sed 's@/lib/ld-linux.so.2@/tools&@g' \
  > `dirname $(gcc -print-libgcc-file-name)`/specs

Während dem Installationsvorgang durchsucht GCCs fixincludes-Skript Ihr System nach möglicherweise zu reparierenden Header-Dateien (sie könnten z. B. Syntaxfehler enthalten) und installiert die reparierten Dateien dann in einen privaten Include-Ordner. Es kann vorkommen, dass das Skript einige Header-Dateien von Ihrem Host-System repariert und diese dann in den privaten GCC-Include-Ordner kopiert. Weil Sie im Rest dieses Kapitels wirklich nur auf die Header-Dateien von GCC und Glibc angewiesen sind, und diese bereits installiert sind, können alle „reparierten“ Header-Dateien problemlos gelöscht werden. Dadurch verhindern Sie, dass Header-Dateien von Ihrem Host-System Einfluss auf das neue LFS-System nehmen können. Führen Sie bitte das folgende Kommando aus, um die Header-Dateien in GCCs privatem Include-Ordner zu löschen. Am besten verwenden Sie dazu Kopieren und Einfügen anstatt die Befehle von Hand abzuschreiben:

GCC_FIXED=`dirname $(gcc -print-libgcc-file-name)`/include-fixed &&
find ${GCC_FIXED}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_FIXED}/*` &&
unset GCC_FIXED
[Achtung]

Achtung

An diesem Punkt ist es unbedingt notwendig, die korrekte Funktion der Toolchain (Kompilieren und Linken) zu überprüfen. Darum führen Sie nun einen kleinen „Gesundheitscheck“ durch:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Wenn alles korrekt funktioniert, sollten keine Fehler auftreten und die Ausgabe des letzten Kommandos sieht so oder so ähnlich aus:

[Requesting program interpreter:
    /tools/lib/ld-linux.so.2]

Achten Sie besonders darauf, dass /tools/lib als Prefix zu Ihrem dynamischen Linker angegeben ist.

Wenn Sie keine oder eine andere als die obige Ausgabe erhalten haben, ist etwas schiefgelaufen. Sie müssen alle Ihre Schritte noch einmal überprüfen und den Fehler finden und korrigieren. Fahren Sie nicht fort, bevor Sie den Fehler nicht beseitigt haben. Als erstes führen Sie nochmals den Gesundheitscheck durch und benutzen gcc anstelle von cc. Wenn das funktioniert, fehlt der Link von /tools/bin/cc. Gehen Sie zurück zu Abschnitt 5.5, „GCC-4.3.2 - Durchlauf 1“ und reparieren Sie den symbolischen Link. Als zweites stellen Sie bitte sicher, dass Ihre Umgebungsvariable PATH richtig gesetzt ist. Sie können die Variable mit dem Kommando echo $PATH anzeigen lassen; prüfen Sie, dass /tools/bin am Anfang der Liste steht. Wenn die PATH Variable falsch gesetzt ist, sind Sie möglicherweise nicht als lfs eingeloggt oder in Abschnitt 4.4, „Vorbereiten der Arbeitsumgebung“ ist etwas schiefgelaufen. Vielleicht hat auch beim Anpassen der specs-Datei etwas nicht richtig funktioniert. In diesem Fall wiederholen Sie die Anpassung und benutzen Sie Kopieren und Einfügen, um das Kommando auszuführen, tippen Sie es nicht ab.

Wenn Sie mit dem Ergebnis zufrieden sind, räumen Sie auf:

rm -v dummy.c a.out
[Anmerkung]

Anmerkung

Das Kompilieren von Tcl im nächsten Abschnitt ist gleichzeitig auch ein zusätzlicher Test, ob die Toolchain korrekt erstellt wurde. Falls Tcl nicht kompilierbar ist, weist das auf einen Fehler mit Binutils, GCC oder Glibc hin, nicht aber auf einen Fehler in Tcl.