Die Glibc "integrieren"

Jetzt wo die temporären C-Bibliotheken installiert sind, wollen wir alle Werkzeuge, die im Rest des Kapitels kompiliert werden, gegen diese Bibliotheken verlinken. Um das zu erreichen, müssen wir den Linker und die Specs-Datei des Compilers anpassen. Manche Leute meinen das untenstehende wäre Schwarze Magie, aber in Wirklichkeit ist es ganz einfach.

Installieren Sie zuerst den angepassten Linker (die Anpassung haben Sie am Schluss des ersten Binutils-Durchlaufs durchgeführt) in dem Sie folgendes Kommando im Ordner binutils-build ausführen:

make -C ld install

Von diesem Punkt an wird alles ausschliesslich gegen die Bibliotheken in /tools/lib verlinkt.

[Hinweis]

Hinweis

Falls Sie die Warnung, die Binutils-Ordner nicht zu löschen, übersehen haben oder Sie vielleicht versehentlich gelöscht haben, seien Sie unbesorgt. Es ist noch nicht alles verloren. Ignorieren Sie das obige Kommando einfach. Die Folge davon ist ein gewisses Risiko, dass 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, da der angepasste Linker installiert ist, müssen Sie die Binutils-Ordner löschen.

Als nächstes müssen Sie die GCC Specs-Datei ergänzen, so dass sie den neuen dynamischen Linker referenziert. Ein einfaches sed-Kommando erledigt diese Aufgabe:

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 nicht abzutippen sondern mittels Kopieren und Einfügen auszuführen. 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]

Wichtig

Wenn Sie auf einer Plattform arbeiten, auf 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 „Technische Anmerkungen zur Toolchain“ nach.

Schließlich ist möglich, dass einige Include-Dateien vom Host-System mit in den privaten Include-Ordner von GCC geraten sind. So etwas kann durch GCC's „fixincludes“-Prozess geschehen, der beim Kompilieren von GCC ausgeführt wird. Dazu werden wir später noch näheres erklären. Zunächst führen Sie das folgende Kommando aus, um dieses Problem zu umgehen:

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

Vorsicht

An diesem Punkt ist es unbedingt notwendig, die korrekte Funktion der Toolchain (Kompilieren und Linken) zu überprüfen. Darum führen wir nun einen kleinen „Gesundheitscheck“ durch:

echo 'main(){}' > dummy.c
cc 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]

Achten Sie besonders darauf, dass /tools/lib der Prefix zu ihrem dynamischen Linker ist.

Wenn Sie keine oder eine andere als die obige Ausgabe Ausgabe erhalten haben, 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. Als erstes führen Sie nochmals den „Gesundheitscheck“ durch und benutzen gcc anstelle von cc. Wenn das funktioniert, fehlt die Verknüpfung von /tools/bin/cc. Gehen Sie zurück zu „GCC-3.3.3 - Durchlauf 1“ und reparieren Sie die Verknüpfung. Als zweites stellen Sie bitte sicher, dass Ihre Umgebungsvariable PATH richtig gesetzt ist. Sie können die Variable mit dem Kommando echo $PATH anzeigen; prüfen Sie, dass /tools/bin am Anfang der Liste steht. Wenn die PATH Variable falsch gesetzt ist, sind Sie möglicherweise nicht als lfs eingeloggt oder in „Vorbereiten der Arbeitsumgebung“ ist etwas schiefgelaufen. Es könnte auch etwas beim Anpassen der Specs-Datei fehlgeschlagen sein. In diesem Fall wiederholen Sie die Anpassung und benutzen Sie Kopieren und Einfügen, um das Kommando auszuführen, tippen Sie es nicht ab.

Wenn Sie mit dem Ergebnis zufrieden sind, löschen Sie die Testdateien:

rm dummy.c a.out