5.9. Anpassen der Toolchain

Jetzt, nachdem die temporären C-Bibliotheken installiert sind, wollen wir alle Werkzeuge, die im Rest des Kapitels kompiliert werden, 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 am Schluss des ersten Binutils-Durchlauf 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.

[Hinweis]

Hinweis

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. Die Folge ist 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 wir später den zweiten Durchlauf der Binutils installieren.

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

Als nächstes muss die GCC specs-Datei 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 per 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.3, „Technische Anmerkungen zur Toolchain“ nach.

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

rm -f /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}
[Vorsicht]

Vorsicht

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 die Verknüpfung von /tools/bin/cc. Gehen Sie zurück zu Abschnitt 5.5, „GCC-3.4.1 - 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 dummy.c a.out