Erneutes Anpassen der Toolchain

Nun, da die neue C Bibliothek installiert ist, muss die Toolchain erneut angepasst werden. Wir modifizieren sie so, dass alle weiteren kompilierten Programme gegen die neue C-Bibliothek gelinkt werden. Im Grunde ist das genau das gleiche, was wir im vorigen Kapitel beim Anpassen der Glibc schonmal gemacht haben, auch wenn es aussieht, als wäre es genau umgekehrt: Im vorigen Kapitel haben wir die Toolchain von /{,usr/}lib auf dem Host in das neue Verzeichnis /tools/lib umgelenkt. Nun lenken wir die Toolchain von diesem Verzeichns /tools/lib um nach /{,usr/}lib in unserem LFS-System.

Als erstes wird der Linker angepasst. Aus diesem Grunde haben wir die Quell- und Kompilierordner aus dem zweiten Durchlauf von Binutils bestehen lassen. Installieren Sie den angepassten Linker aus dem binutils-build-Ordner:

make -C ld INSTALL=/tools/bin/install install
[Hinweis]

Hinweis

Falls Sie aus irgendeinem Grund die Warnung übersehen haben, den Binutils-Ordner zu behalten oder ihn vielleicht versehentlich gelöscht haben, ist noch nichts verloren. Ignorieren Sie einfach das obige Kommando. Daraus resultiert, dass das nächste Paket, Binutils, gegen die Glibc-Bibliotheken in /tools anstelle von /usr gelinkt wird. Das ist zwar nicht ideal, aber unsere Tests haben gezeigt, dass die resultierenden Programme identisch zu sein scheinen.

Von nun an wird jedes kompilierte Programme nur gegen die Bibliotheken in /usr/lib und /lib gelinkt. Das zusätzliche INSTALL=/tools/bin/install wird benötigt, weil das Makefile aus dem zweiten Durchlauf immer noch die Referenz auf /usr/bin/install enthält, welches wir noch nicht installiert haben. Einige Distributionen enthalten einen symbolischen Link ginstall, der Vorrang im Makefile hat und hier Probleme verursachen kann. Das obige Kommando kümmert sich auch darum.

Sie können nun die Binutils Quell- und Kompilierordner löschen.

Als nächstes passen Sie die Specs-Datei von GCC an, so dass sie auf den neuen dynamischen Linker verweist. Wie schon zuvor benutzen wir dazu sed:

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
    $SPECFILE > newspecfile &&
mv -f newspecfile $SPECFILE &&
unset SPECFILE

Auch hier empfehlen wir, den Befehl zu kopieren und einzufügen. Und auch hier ist es wieder sinnvoll, die Specs-Datei darauf zu überprüfen, ob die Änderungen tatsächlich erfolgreich durchgeführt wurden.

[Wichtig]

Wichtig

Wenn Sie an einer Plattform arbeiten, bei der der Name des Linkers nicht ld-linux.so.2 ist, müssen Sie in den obigen Kommandos ld-linux.so.2 durch dem Namen des Linkers für Ihre Plattform ersetzen. Wenn nötig, schlagen Sie nochmal im Abschnitt „Technische Anmerkungen zur Toolchain“ nach.

[Vorsicht]

Vorsicht

Es ist an diesem Punkt zwingend notwendig, die grundlegenden Funktionen (Kompilieren und Linken) der angepassten Toolchain zu überprüfen. Aus diesem Grund führen wir folgenden Test durch:

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

Wenn alles korrekt funktioniert, sollten keine Fehler auftreten und die Ausgabe des letzten Kommandos ist:

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

Beachten Sie, dass /lib nun der Prefix zum dynamischen Linker ist.

Wenn Sie eine andere oder überhaupt keine Ausgabe erhalten, ist etwas ernsthaft schiefgelaufen. Sie müssen das überprüfen und alle Schritte noch einmal nachvollziehen, um das Problem zu finden und zu beheben. Machen Sie nicht weiter, solange das Problem nicht behoben ist. Am wahrscheinlichsten ist, dass etwas beim Anpassen der Specs-Datei weiter oben nicht funktioniert hat.

Wenn Sie mit dem Ergebnis zufrieden sind, löschen Sie die Testdateien:

rm dummy.c a.out