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:
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