Geschätzte Kompilierzeit: 11.0 SBU Ungefähr benötigter Festplattenplatz: 274 MB |
Die Hilfmittel zum testen von GCC und Binutils sind nun installiert (Tcl, Expect und DejaGnu). Wir können GCC und Binutils nun erneut installieren, sie gegen die neue Glibc verlinken und testen. Eine Sache die es noch zu beachten gibt: Die Test-suites sind stark von funktionierenden Pseudo-Terminals (PTYs) abhängig. Diese werden von dem Host-System bereitgestellt. Heutzutage werden PTYs meist über das devpts Dateisystem implementiert. Ob ihr Host-System korrekt eingerichtet ist können sie mit einem einfachen Test feststellen:
expect -c "spawn ls" |
Wenn sie diese Meldung erhalten:
The system has no more ptys. Ask your system administrator to create more.
ist ihr Host-System nicht korrekt für PTYs eingerichtet. Solange sie dieses Problem nicht behoben haben brauchen sie die Test-suites von GCC und Binutils gar nicht erst durchlaufen zu lassen. Wenn sie mehr Informationen zum einrichten von PTYs brauchen, schauen sie am besten in das LSF Wiki unter http://wiki.linuxfromscratch.org/.
Entpacken sie alle drei GCC Tar-Archive (-core, -g++ und -testsuite) in ein und demselben Arbeitsverzeichnis. Die Archive entpacken sich in ein einziges gcc-3.3.1/ Unterverzeichnis.
Als erstes korrigieren sie ein Problem und machen eine wichtige Anpassung:
patch -Np1 -i ../gcc-3.3.1-no_fixincludes-2.patch patch -Np1 -i ../gcc-3.3.1-specs-2.patch |
Der este Patch schaltet das GCC "fixincludes" Skript ab. Wir haben das vorher schonmal kurz erwähnt, hier wollen wir eine tiefere Erklärung dazu geben. Unter normalen Umständen durchsucht das GCC fixincludes Skript ihr System nach Header Dateien die repariert werden müssen. Es könnte allerdings der Meinung sein das einige Header Dateien auf ihrem Host-System repariert werden müssen, repariert diese und kopiert sie in das private GCC Include Verzeichnis. Später dann in Kapitel 6, nachdem wir die neuere Glibc installiert haben, würde dieses private Include Verzeichnis vor den System Include Verzeichnissesn durchsucht werden. GCC würde dann die reparierten Include Dateien von ihrem Host-System finden, und diese passen dann nicht zu der Glibc Version die wir für das LFS System verwendet haben.
Der letzte Patch ändert den GCC standard Pfad des dynamischen Linkers (üblicherweise ld-linux.so.2). Ausserdem entfernt er /usr/include aus dem GCC Include Suchpfad. Durch das jetzige Patchen anstelle des nachträglichen anpassens der specs Datei stellen wir sicher das unser neuer dynamischer Linker während dem Bau von GCC verwendet wird. Das bedeutet, alle endgültigen (und auch temporären) Binärdateien während dem Kompilierdurchlauf werden gegen die neue Glibc gelinkt.
Wichtig: Diese Patche sind Voraussetzung für einen erfolgreichen Gesamtdurchlauf. Vergessen sie nicht sie zu installieren.
Erstellen sie erneut ein dediziertes Verzeichnis zum kompilieren:
mkdir ../gcc-build cd ../gcc-build |
Bevor sie mit dem kompilieren von GCC beginnen, denken sie daran alle Umgebungsvariablen zurückzusetzen die die Standard Optimierungen überschreiben würden.
Bereiten sie nun GCC zum kompilieren vor:
../gcc-3.3.1/configure --prefix=/tools \ --with-local-prefix=/tools \ --enable-clocale=gnu --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-languages=c,c++ |
Die Bedeutung der neuen configure Optionen:
--enable-threads=posix: Das schaltet die Behandlung von C++ exceptions für Threads ein.
--enable-__cxa_atexit: Diese Option erlaubt die Benutzung von __cxa_atexit anstelle von atexit um C++ Destruktoren für lokale statics und globale Objekte zu registrieren. Ausserdem ist die Option für eine vollständig Standard-konforme Behandlung von Destruktoren erforderlich. Das beeinflusst auch die C++ ABI; das Ergebnis sind C++ shared libraries und C++ Programme die interoperabel mit anderen Linux Distributionen sind.
--enable-clocale=gnu: Diese Option stellt sicher, das unter allen Umständen das korrekte locale Modell für die C++ Bibliotheken ausgewählt wird. Falls das configure Skript de_DE locales findet, wird es das korrekte Modell von gnu wählen. Falls aber de_DE nicht installiert ist, besteht das Risiko aufgrund des fälschlicherweise ausgewählten Modells generic ABI-inkompatible C++ Bibliotheken zu erzeugen.
--enable-languages=c,c++: Diese Option wird benötigt damit sowohl C, als auch C++ Compiler erzeugt werden.
Kompilieren sie das Paket:
make |
Diesmal müssen sie nicht das bootstrap target verwenden, weil wir bereits einen Compiler benutzen der aus exakt den gleichen Quellen gebaut wurde.
Anmerkung: Es sollte erwähnt werden, das die GCC Test-suite hier nicht so wichtig ist wie in Kapitel 6.
Testen sie die Ergebnisse:
make -k check |
Der Schalter -k lässt die Test-suite bis zum Ende durchlaufen, auch wenn Fehler auftreten sollten. Die GCC Test-suite ist sehr umfangreich und es ist beinahe sicher das Fehler auftreten. Um eine Zusammenfassung der Test Ergebnisse zu erhalten benutzen sie dieses Kommando:
../gcc-3.3.1/contrib/test_summary | more |
Sie können ihre Ergebnisse mit denen auf der gcc-testresults Mailingliste veröffentlichten vergleichen die eine ähnliche System-Konfiguration wie sie haben. Ein Beispiel wie GCC-3.3.1 auf i686-pc-linux-gnu aussehen sollte finden sie unter http://gcc.gnu.org/ml/gcc-testresults/2003-08/msg01612.html.
Beachten sie, das das Ergebnis folgendes enthält:
* 1 XPASS (unexpected pass) for g++ * 1 FAIL (unexpected failure) for g++ * 2 FAIL for gcc * 26 XPASS's for libstdc++ |
Der unerwartet erfolgreiche Durchlauf für g++ ist weil wir --enable-__cxa_atexit benutzt haben. Offensichtlich unterstützen nicht alle von GCC unterstützten Plattformen "__cxa_atexit" in ihren C Bibliotheken, daher wird das erfolgreiche durchlaufen dieses Tests als unerwartet betrachtet.
Die 26 unerwartet erfolgreichen Durchläufe für libstdc++ sind begründet durch die Option --enable-clocale=gnu, welches die korrekte Wahl auf Glibc basierten Systemen Version 2.2.5 oder höher ist. Die zugrundeliegende locale Unterstützung in der GNU C Bibliothek ist besser als das ansonsten gewählte Modell "generic" (welches anwendbar wäre, wenn sie zum Beispiel Newlibc, Sun-libc oder eine sonstige libc verwenden würden). Die libstdc++ Test-suite erwartet anscheinend das "generic" Modell, daher wird nicht erwartet das dieses Tests erfolgreich durchlaufen.
Unerwartete Fehler lassen sich oftmals gar nicht vermeiden. Die GCC Entwickler kennen diese üblicherweise bereits, aber hatten noch keine Zeit diese Fehler zu beheben. Kurz gesagt, solange ihre Test Ergebnisse nicht grob von denen unter der obigen URL abweichen, ist es in Ordnung einfach fortzufahren.
Schlussendlich installieren sie das Paket:
make install |
Anmerkung: An diesem Punkt empfehlen wir dringend, die Gesamtprüfung die wir früher in diesem Kapitel gemacht haben, noch einmal durchzuführen. Schlagen sie im Abschnitt namens Die Glibc "integrieren" nach und wiederholen sie die Prüfung. Wenn die Ergebnisse nicht in Ordnung sind haben sie höchstwahrscheinlich vergessen, den obig erwähnten GCC Specs Patch anzuwenden.
Zurück | Zum Anfang | Weiter |
Installieren von DejaGnu-1.4.3 | Nach oben | Installieren von Binutils-2.14 - Durchlauf 2 |