6.11. Erneutes Anpassen der Toolchain

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