5.7. 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.

Installieren Sie zuerst den angepassten Linker (die Anpassung haben Sie ja bereits am Ende des ersten Binutils-Durchlaufs durchgeführt) indem Sie im Ordner binutils-build folgendes Kommando ausführen:

make -C ld install

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

[Anmerkung]

Anmerkung

Falls Sie die Warnung, die Binutils-Ordner nicht zu löschen, übersehen haben oder Sie vielleicht versehentlich gelöscht haben, dann ignorieren Sie das obige Kommando. In Folge daraus besteht ein gewisses Risiko, dass nachfolgende Programme gegen Bibliotheken auf dem Host-System gelinkt werden. Das ist nicht ideal, aber auch kein allzu großes Problem. Die Situation wird korrigiert, wenn Sie später den zweiten Durchlauf der Binutils installieren.

Nachdem nun der angepasste Linker installiert ist, müssen Sie die Binutils-Ordner löschen.

Als nächstes muss die specs-Datei von GCC ergänzt werden, so dass sie den neuen dynamischen Linker referenziert. Ein einfaches sed-Skript erledigt diese Aufgabe:

SPECFILE=`gcc --print-file specs` &&
sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

Es wird empfohlen, das obige Kommando nicht abzutippen sondern mittels Kopieren und Einfügen auszuführen. Alternativ können Sie 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“.

Danach sollten Sie die specs-Datei überprüfen und sicherstellen, dass alle gewollten Änderungen durchgeführt wurden.

[Wichtig]

Wichtig

Wenn Sie auf einer Plattform arbeiten, bei der der Name des dynamischen Linkers nicht ld-linux.so.2 lautet, müssen Sie natürlich 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.

Schließlich ist es möglich, dass einige Include-Dateien vom Host-System mit in den privaten Include-Ordner von GCC geraten sind. So etwas kann durch GCCs „fixincludes“-Routine geschehen, die beim Kompilieren von GCC ausgeführt wird. Dazu wird später noch näheres erklärt. Zunächst führen Sie das folgende Kommando aus, um dieses mögliche Problem zu beheben:

rm -vf /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}
[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.4, „GCC-3.4.3 - 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; 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

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.