Die Glibc "integrieren"

Jetzt wo die temporären C Bibliotheken installiert sind, wollen wir alle Werkzeuge im Rest des Kapitels gegen diese Bibliotheken verlinken. Um das zu erreichen müssen wir den Linker und die Spec Datei des Compilers anpassen.

Installieren sie zuerst den angepassten Linker in dem sie folgendes Kommando innerhalb des binutils-build Verzeichnisses ausführen:

make -C ld install

Den Linker haben wir erst kürzlich angepasst, nämlich am Ende des ersten Durchlaufs der Binutils. Ab diesem Punkt wird alles nur gegen die Bibliotheken in /tools/lib verlinkt.

Anmerkung: Falls sie die vorige Warnung, das sie die Binutils Verzeichnisse nicht löschen sollen, übersehen haben sollten oder sie vielleicht versehentlich gelöscht haben, seien sie nicht besorgt. Es ist noch nicht alles verloren. Ignorieren sie das obige Kommando einfach. Das Ergebnis ist ein gewisses Risiko das nachfolgende Programme gegen Bibliotheken auf dem Host-System gelinkt werden. Das ist nicht ideal, aber auch kein allzu grosses Problem. Die Situation wird korrigiert wenn wir später den zweiten Durchlauf der Binutils installieren.

Nun wo der angepasste Linker installiert ist müssen sie die Binutils Verzeichnisse löschen.

Als nächstes müssen sie die GCC Spec Datei ergänzen so das sie den neuen dynamischen Linker referenziert. Ein einfaches sed Kommando erledigt dies:

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

Wir empfehlen, das obige Kommando mittels kopieren und einfügen auszuführen anstelle es abzutippen. Sie können die Specs Datei auch per Hand ändern: ersetzen sie einfach jedes vorkommen von "/lib/ld-linux.so.2" durch "/tools/lib/ld-linux.so.2".

Wichtig: Wenn sie auf einer Plattform arbeiten an der der Name des dynamischen Linkers anders lautet als ld-linux.so.2, müssen sie natürlich statt ld-linux.so.2 den korrekten Namen des Linkers für ihre Plattform einsetzen. Falls nötig schauen sie nochmal im Abschnitt namens Technische Anmerkungen zur toolchain nach.

Letztlich könnten möglicherweise einige include Dateien vom Host-System mit in das private include Verzeichnis des GCC geraten sein. Soetwas kann durch GCC's "fixincludes" Prozess geschehen der während dem kompilieren von GCC ausgeführt wird. Dazu werden wir später noch näheres erklären. Nun führen sie erstmal das folgende Kommando aus um dieses Problem zu umgehen:

rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

Achtung

Es ist unbedingt notwendig an diesem Punkt die korrekte Funktion der toolchain (kompilieren und linken) zu überprüfen. Darum führen wir nun einen kleinen "Gesundheitscheck" durch:

echo 'main(){}' > dummy.c
gcc dummy.c
readelf -l a.out | grep ': /tools'

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

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

Wenn sie nicht die obige Ausgabe oder überhaupt keine Ausgabe erhielten, ist etwas ernsthaft schiefgelaufen. Sie müssen alle ihre Schritte noch einmal überprüfen und den Fehler finden und korrigieren. Machen sie nicht weiter bevor sie den Fehler nicht beseitigt haben. Am wahrscheinlichsten ist, das beim manipulieren der Specs Datei etwas nicht richtig funktioniert hat. Achten sie besonders darauf, das /tools/lib der Prefix zu ihrem dynamischen Linker ist. Wenn sie an einer Plattform arbeiten wo der Name des Linkers nicht ld-linux.so.2 ist, könnte die Ausgabe natürlich leicht abweichen.

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

rm dummy.c a.out

Damit ist die Installation der eigenständigen, in sich geschlossenen toolchain abgeschlossen, sie kann nun zum erstellen der restlichen temporären Hilfsmittel verwendet werden.