6.10. Erneutes Anpassen der Toolchain

Nachdem die neue C-Bibliothek nun installiert ist, muss die Toolchain erneut angepasst werden. Modifizieren Sie sie so, dass alle weiteren kompilierten Programme gegen die neue C-Bibliothek gelinkt werden. Im Grunde ist das fast das Gleiche, was Sie im vorigen Kapitel beim Anpassen der Glibc schonmal gemacht haben, auch wenn es aussieht, als wäre es genau umgekehrt: Im vorigen Kapitel haben Sie die Toolchain von /{,usr/}lib auf dem Host in den neuen Ordner /tools/lib umgelenkt. Nun lenken Sie die Toolchain von diesem Ordner /tools/lib, um auf unsere LFS-Ordner /{,usr/}lib.

Erstellen Sie zunächst eine Sicherungskopie des Linkers in /tools und ersetzen Sie ihn dann mit dem angepassten Linker aus Kapitel 5. Zu seinem Gegenstück in /tools/$(gcc -dumpmachine)/bin werden wir ebenfalls eine symbolische Verknüpfung einrichten:

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

Als nächstes müssen Sie GCCs „specs“-Datei so bearbeiten, dass sie den neuen dynamischen Linker referenziert, damit GCC die korrekten Header- und Startdateien findet. Diese Aufgabe wird von einem einfachen sed-Kommando erledigt:

[Wichtig]

Wichtig

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

gcc -dumpspecs | sed \
    -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
    `dirname $(gcc --print-libgcc-file-name)`/specs

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

An dieser Stelle ist es zwingend nötig, die grundlegenden Funktionen (Kompilieren und Linken) der angepassten Toolchain zu überprüfen. Aus diesem Grund führen Sie bitte die folgenden Tests durch:

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
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 nun /lib der Prefix zum dynamischen Linker ist.

Überprüfen Sie nun, dass die korrekten Startdateien verwendet werden:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

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

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded

Stellen Sie sicher, dass der Compiler nach den korrekten Header-Dateien sucht:

grep -B1 '^ /usr/include' dummy.log

Dieses Kommando sollte erfolgreich mit den folgen Ausgaben beendet werden:

#include <...> search starts here:
 /usr/include

Stellen Sie als nächstes sicher, dass der neue Linker mit den korrekten Suchpfaden verwendet wird:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

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

SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");

Danach prüfen Sie, ob die korrekte libc eingesetzt wird:

grep "/lib/libc.so.6 " dummy.log

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

attempt to open /lib/libc.so.6 succeeded

Und zum Schluss kontrollieren Sie noch, ob GCC den richtigen dynamischen Linker benutzt:

grep found dummy.log

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

found ld-linux.so.2 at /lib/ld-linux.so.2

Wenn Sie eine andere oder überhaupt keine Ausgabe erhalten, ist etwas ernsthaft schiefgelaufen. Sie müssen das überprüfen und alle bisherigen 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 -v dummy.c a.out dummy.log