Erstelle zunächst eine Sicherungskopie des Linkers in /tools
und ersetze ihn dann mit dem angepassten
Linker aus Kapitel 4. 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 musst Du die GCC „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:
gcc -dumpspecs | sed -e 's@/tools@@g' \ -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \ `dirname $(gcc --print-libgcc-file-name)`/specs
An dieser Stelle ist es zwingend nötig, die grundlegenden Funktionen (Kompilieren und Linken) der angepassten Toolchain zu überprüfen. Aus diesem Grund führe 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]
Überprüfe nun, dass die korrekten Startdateien verwendet werden:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Wenn alles richtig gelaufen ist sollte folgende Ausgabe kommen:
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
Überprüfe das der Kompiler die richtigen Header Dateien sucht:
grep -B1 '^ /usr/include' dummy.log
Hier sollte folgendes kommen:
#include <...> search starts here:
/usr/include
Als nächstes überprüfe das der neue Linker mit den korrekten Suchpfaden benutzt wird:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Wenn alles richtig arbeitet sollten keine Fehler auftauchen und die folgende Ausgabe erscheinen:
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
Überprüfen ob wir die richtige Version der Glibc nutzen:
grep "/lib.*/libc.so.6 " dummy.log
Die Ausgabe des letzten Kommandos sollte wie folgt sein:
attempt to open /lib/libc.so.6 succeeded
Als letztes prüfen wir ob GCC den richtigen 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 Du eine andere oder überhaupt keine Ausgabe erhältst, ist etwas ernsthaft schief gelaufen. Du musst das überprüfen und alle bisherigen Schritte noch einmal nachvollziehen, um das Problem zu finden und zu beheben. Mache nicht weiter, solange das Problem nicht behoben ist. Am wahrscheinlichsten ist, dass etwas beim Anpassen der specs-Datei weiter oben nicht funktioniert hat.
Wenn alles korrekt gelaufen ist, lösche die Testdateien:
rm -v dummy.c a.out dummy.log