Erneutes anpassen der toolchain

Nun wo die neue C Bibliothek installiert ist, muss die toolchain erneut angepasst werden. Wir modifizieren sie so, das alle weiteren kompilierten Programme gegen die neue C Bibliothek gelinkt werden. Im Grunde ist das genau das Gegenteil von dem was wir im vorigen Kapitel beim einhängen der Glibc gemacht haben.

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

make -C ld INSTALL=/tools/bin/install install

Anmerkung: Falls sie aus irgendeinem Grund die Warnung, das Binutils Verzeichnis zu behalten, übersehen haben oder es vielleicht versehentlich gelöscht haben, es ist noch nichts verloren. Ignorieren sie einfach das obige Kommando. Das Ergebnis ist dann, das 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 das 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 Symlink 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 Kompilierverzeichnisse löschen.

Als nächstes passen sie die GCC Specs Datei an, so das sie auf den neuen dynamischen Linker zeigt. 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 zu überprüfen ob die Änderungen tatsächlich gemacht wurden.

Wichtig: Wenn sie an einer Plattform arbeiten wo 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 namens Technische Anmerkungen zur toolchain in Kapitel 5 nach.

Achtung

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
gcc dummy.c
readelf -l a.out | grep ': /lib'

Wenn alles richtig funktioniert sollte es keine Fehlermeldungen geben und die Ausgabe des letzten Kommandos sollte dann so aussehen:

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

Wenn sie eine andere Ausgabe erhalten oder überhaupt keine Ausgabe erscheint, 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, das etwas beim anpassen der Specs Datei weiter oben nicht funktioniert hat. Achten sie besonders darauf, das /lib nun als Prefix zu unserem dynamischen Linker angezeigt wird. Wenn sie an einer Plattform arbeiten an der der Name des dynamischen Linkers nicht ld-linux.so.2 ist, sieht die Ausgabe natürlich ein klein wenig anders aus.

Wenn sie mit dem Ergebnis zufrieden sind, löschen sie die Test Dateien:

rm dummy.c a.out