Jetzt, nachdem die temporären C-Bibliotheken installiert sind, wollen wir alle im Rest des Kapitels kompilierten Werkzeuge gegen diese Bibliotheken verlinken. Um das zu erreichen, müssen Sie den Linker und die specs-Datei des Compilers anpassen.
Der am Ende des ersten Durchlaufes von Binutils angepasste Linker
muss umbenannt werden, da er sonst nicht korrekt gefunden und benutzt
wird. Sichern Sie zunächst den ursprünglichen Linker, dann ersetzen
Sie ihn durch den angepassten. Außerdem erzeugen Sie eine Verknüpfung
auf das Gegenstück in /tools/$(gcc -
dumpmachine)/bin
:
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
Von diesem Punkt an wird alles ausschließlich
gegen die Bibliotheken in
/tools/lib
verlinkt.
Der nächste Schritt ist nun, GCC auf den neuen dynamischen Linker zu verweisen. Legen Sie dazu GCCs „specs“-Datei an einem Ort ab, wo GCC standardmäßig sucht. Dann wird der von GCC verwendete dynamische Linker durch einen einfachen sed-Aufruf angepasst.
Es wird empfohlen, das obige Kommando nicht abzuschreiben, sondern mittels Kopieren und Einfügen auszuführen. Sie können die „specs“-Datei auch von Hand ändern: ersetzen Sie einfach jedes Vorkommen von „/lib/ld-linux.so.2“ durch „/tools/lib/ld-linux.so.2“:
Wenn Sie mit einer Rechner-Plattform arbeiten, bei der der Name des
dynamischen Linkers nicht ld-linux.so.2
lautet, müssen Sie statt
„ld-linux.so.2“ den
korrekten Namen des Linkers für Ihre Plattform einsetzen. Falls
nötig, schauen Sie nochmal im Abschnitt Abschnitt 5.2,
„Technische Anmerkungen zur Toolchain“ nach.
gcc -dumpspecs | sed 's@/lib/ld-linux.so.2@/tools&@g' \ > `dirname $(gcc -print-libgcc-file-name)`/specs
Während dem Installationsvorgang durchsucht GCCs fixincludes-Skript Ihr System nach möglicherweise zu reparierenden Header-Dateien (sie könnten z. B. Syntaxfehler enthalten) und installiert die reparierten Dateien dann in einen privaten Include-Ordner. Es kann vorkommen, dass das Skript einige Header-Dateien von Ihrem Host-System repariert und diese dann in den privaten GCC-Include-Ordner kopiert. Weil Sie im Rest dieses Kapitels wirklich nur auf die Header-Dateien von GCC und Glibc angewiesen sind, und diese bereits installiert sind, können alle „reparierten“ Header-Dateien problemlos gelöscht werden. Dadurch verhindern Sie, dass Header-Dateien von Ihrem Host-System Einfluss auf das neue LFS-System nehmen können. Führen Sie bitte das folgende Kommando aus, um die Header-Dateien in GCCs privatem Include-Ordner zu löschen. Am besten verwenden Sie dazu Kopieren und Einfügen anstatt die Befehle von Hand abzuschreiben:
GCC_FIXED=`dirname $(gcc -print-libgcc-file-name)`/include-fixed && find ${GCC_FIXED}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; && rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_FIXED}/*` && unset GCC_FIXED
An diesem Punkt ist es unbedingt notwendig, die korrekte Funktion der Toolchain (Kompilieren und Linken) zu überprüfen. Darum führen Sie 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 sieht so oder so ähnlich aus:
[Requesting program interpreter:
/tools/lib/ld-linux.so.2]
Achten Sie besonders darauf, dass /tools/lib
als Prefix zu Ihrem dynamischen Linker
angegeben ist.
Wenn Sie keine oder eine andere als die obige Ausgabe erhalten
haben, ist etwas schiefgelaufen. Sie müssen alle Ihre Schritte noch
einmal überprüfen und den Fehler finden und korrigieren. Fahren Sie
nicht fort, 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 der Link von /tools/bin/cc
. Gehen Sie zurück zu Abschnitt 5.5, „GCC-4.3.2
- Durchlauf 1“ und reparieren Sie den symbolischen Link.
Als zweites stellen Sie bitte sicher, dass Ihre Umgebungsvariable
PATH
richtig gesetzt ist. Sie können die
Variable mit dem Kommando echo
$PATH anzeigen lassen; 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 Abschnitt 4.4,
„Vorbereiten der Arbeitsumgebung“ ist etwas
schiefgelaufen. Vielleicht hat auch beim Anpassen der specs-Datei
etwas nicht richtig funktioniert. 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, räumen Sie auf:
rm -v dummy.c a.out
Das Kompilieren von Tcl im nächsten Abschnitt ist gleichzeitig auch ein zusätzlicher Test, ob die Toolchain korrekt erstellt wurde. Falls Tcl nicht kompilierbar ist, weist das auf einen Fehler mit Binutils, GCC oder Glibc hin, nicht aber auf einen Fehler in Tcl.