GCC-3.3.3 - Durchlauf 2

Approximate build time:  11.0 SBU
Required disk space:     332.7 MB

Neuinstallation von GCC

Die Hilfsmittel 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. Es gibt eine Sache, die noch beachtet werden muss: Die Testsuites sind stark von funktionierenden Pseudo-Terminals (PTYs) abhängig. Diese werden vom Host-System bereitgestellt. Heutzutage werden PTYs meist über das Dateisystem devpts 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 Testsuites 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 LFS-Wiki unter http://wiki.linuxfromscratch.org/.

Diesmal kompilieren wir sowohl den C- als auch den C++-Compiler. Entpacken Sie die GCC core- und g++- Tarballs (und -testsuite, falls Sie die Test durchlaufen lassen möchten). Die Archive entpacken sich in einen einzigen Unterordner namens gcc-3.3.3/.

Zuerst korrigieren Sie ein Problem und führen eine wichtige Anpassung durch:

patch -Np1 -i ../gcc-3.3.3-no_fixincludes-1.patch
patch -Np1 -i ../gcc-3.3.3-specs-1.patch

Der erste Patch schaltet das GCC „fixincludes“-Skript ab. Wir haben das vorher bereits kurz erwähnt; hier wollen wir eine nähere Erklärung dazu geben. Unter normalen Umständen durchsucht das fixincludes-Skript von GCC Ihr System nach Header-Dateien die repariert werden müssen. Dabei kann es vorkommen, dass das Skript der Meinung ist, einige Header-Dateien auf Ihrem Host-System müssten repariert werden. GCC repariert diese dann und kopiert sie in den privaten GCC Include-Ordner. Später dann, in Chapter 6, nachdem wir die neuere Glibc installiert haben, würde dieser private Include-Ordner vor den System Include-Ordnern durchsucht werden. GCC würde dann die reparierten Include-Dateien des Host-Systems finden, und diese passen dann höchstwahrscheinlich nicht zu der Glibc-Version, die wir für das LFS-System verwendet haben.

Der zweite Patch ändert den GCC-Standardpfad zum dynamischen Linker (üblicherweise ld-linux.so.2). Ausserdem entfernt er /usr/include aus dem GCC Include-Suchpfad. Das Patchen an dieser Stelle statt des nachträglichen Anpassens der Specs-Datei stellt sicher, dass beim Kompilieren von GCC unser neuer dynamischer Linker verwendet wird. Das bedeutet, dass alle endgültigen (und auch temporären) Binärdateien beim Kompiliervorgang gegen die neue Glibc gelinkt werden.

[Wichtig]

Wichtig

Diese Patches sind zwingende Voraussetzung für einen erfolgreichen Gesamtdurchlauf. Vergessen Sie nicht, sie zu installieren.

Erstellen Sie erneut einen eigenen Ordner 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.3/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-clocale=gnu: Diese Option stellt sicher, dass 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 gnu wählen. Falls aber de_DE nicht installiert ist, besteht das Risiko, dass aufgrund des fälschlicherweise ausgewählten Modells generic ABI-inkompatible C++-Bibliotheken erstellt werden.

  • --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 standardkonforme 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-languages=c,c++: Diese Option wird benötigt, damit sowohl der C- als auch der 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.

Der Kompiliervorgang ist nun abgeschlossen. Wie bereits erwähnt, empfehlen wir, die Testsuite für das temporäre System in diesem Kapitel nicht durchlaufen zu lassen. Falls Sie die Testsuite für GCC dennoch laufen lassen möchten, führen Sie dieses Kommando aus:

make -k check

Der Schalter -k lässt die Testsuite bis zum Ende durchlaufen, auch wenn Fehler auftreten sollten. Die Testsuite von GCC ist sehr umfangreich und es ist beinahe sicher, dass Fehler auftreten. Um eine Zusammenfassung der Ergebnisse zu erhalten, benutzen Sie dieses Kommando:

../gcc-3.3.3/contrib/test_summary

(Wenn Sie nur die Zusammenfassungen sehen möchten, pipen Sie die Ausgabe durch grep -A7 Summ.)

Sie können Ihre Ergebnisse mit denen in der gcc-testresults-Mailingliste veröffentlichten vergleichen, die eine ähnliche System-Konfiguration wie Sie haben. Ein Beispiel wie GCC-3.3.3 auf i686-pc-linux-gnu aussehen sollte finden Sie unter http://gcc.gnu.org/ml/gcc-testresults/2004-01/msg00826.html.

Beachten Sie, dass das Ergebnis folgendes enthält:

* 1 XPASS (unexpected pass) for g++
* 1 FAIL (unexpected failure) for gcc
* 24 XPASS's for libstdc++

Der erfolgreiche Durchlauf für g++ ist unerwartet, 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 24 unerwartet erfolgreichen Durchläufe für libstdc++ sind begründet durch die Option --enable-clocale=gnu, das die korrekte Wahl Systeme ist die auf Glibc Version 2.2.5 oder höher basieren. Die zugrunde liegende 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++ Testsuite erwartet anscheinend das Modell generic, daher ist das erfolgreiche Absolvieren dieser Tests unerwartet.

Ein paar unerwartete Fehler lassen sich oftmals gar nicht vermeiden. Die Entwickler von GCC kennen diese üblicherweise bereits, hatten aber noch keine Zeit, diese Fehler zu beheben. Kurz gesagt, solange Ihre Testergebnisse nicht grob von denen unter der obigen URL abweichen, können sie beruhigt fortfahren.

Schlussendlich installieren Sie das Paket:

make install
[Hinweis]

Hinweis

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 „Die Glibc "integrieren"“ nach und wiederholen Sie die Prüfung. Wenn die Ergebnisse nicht in Ordnung sind, haben Sie höchstwahrscheinlich vergessen, den oben erwähnten GCC Specs-Patch einzuspielen.

Details zu diesem Paket finden Sie in „Inhalt von GCC“.