5.13. GCC-3.4.1 - Durchlauf 2

Geschätzte Kompilierzeit: 11.0 SBU

Ungefähr benötigter Festplattenplatz: 274 MB

GCC ist abhängig von: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed und Texinfo

5.13.1. Neuinstallation von GCC

Dieses Paket funktioniert nicht gut, wenn nicht die Standard Optimierungseinstellungen (inklusive der Optionen -march und -mcpu) benutzt werden. Deshalb sollten eventuell gesetzte Umgebungsvariablen, die die Standardoptimierung überschreiben - zum Beispiel CFLAGS und CXXFLAGS - für den Kompiliervorgang zurückgesetzt oder entsprechend abgeändert werden.

Die Hilfsmittel zum Testen von GCC und Binutils sind nun installiert (Tcl, Expect und DejaGNU). Sie können GCC und Binutils nun erneut installieren, gegen die neue Glibc verlinken und testen. Eine Sache muss noch beachtet werden: 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"

Das Ergebnis könnte so aussehen:

The system has no more ptys.  
Ask your system administrator to create more.

Wenn Sie die obige Meldung sehen, 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 Sie sowohl den C- als auch den C++-Compiler. Entpacken Sie die GCC core- und g++- Tarballs (und -testsuite, falls Sie die Testsuite durchlaufen lassen möchten). Die Archive entpacken sich in einen einzigen Unterordner namens gcc-3.4.1/.

Zuerst korrigieren Sie ein Problem und nehmen eine wichtige Anpassung vor:

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

Der erste Patch schaltet das fixincludes-Skript von GCC ab. Wir haben das vorher bereits kurz erwähnt; hier wollen wir eine nähere Erklärung dazu geben. Unter normalen Umständen durchsucht GCC's fixincludes-Skript Ihr System nach zu reparierenden Header-Dateien. 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 Kapitel 6, nachdem Sie 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 Sie 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 Include-Suchpfad von GCC. 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. Sie dürfen nicht vergessen, sie zu installieren!

Erstellen Sie erneut einen eigenen Ordner zum Kompilieren:

mkdir ../gcc-build
cd ../gcc-build

Denken Sie daran, vor dem Kompilieren von GCC alle Umgebungsvariablen zurückzusetzen, die die Standard-Optimierungen überschreiben würden.

Bereiten Sie GCC zum Kompilieren vor:

../gcc-3.4.1/configure --prefix=/tools \
    --libexecdir=/tools/lib --with-local-prefix=/tools \
    --enable-clocale=gnu --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-languages=c,c++ --disable-libstdcxx-pch

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 Kode mit 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 gemeinsame C++-Bibliotheken und C++-Programme die interoperabel mit anderen Linux-Distributionen sind.

--enable-languages=c,c++

Diese Option stellt sicher, dass sowohl der C- als auch der C++-Compiler erzeugt werden.

--disable-libstdcxx-pch

Verhindert das Erzeugen der vorkompilierten Header-Dateien (PCH, pre-compiled header) für libstdc++. Diese Funktion verbraucht viel Platz und wir benötigen sie nicht.

Kompilieren Sie das Paket:

make

Diesmal müssen Sie nicht das bootstrap-Target verwenden, weil Sie 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 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, selbst 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.4.1/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.4.1 auf i686-pc-linux-gnu aussehen sollte, finden Sie unter http://gcc.gnu.org/ml/gcc-testresults/2004-07/msg00179.html.

Ein paar unerwartete Fehler lassen sich oftmals 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.

Installieren Sie das Paket:

make install
[Hinweis]

Hinweis

An diesem Punkt wird dringend empfohlen, die Gesamtprüfung, die Sie früher in diesem Kapitel gemacht haben, noch einmal zu wiederholen. Schlagen Sie im Abschnitt 5.9, „Anpassen der Toolchain“ 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 Abschnitt 6.14.2, „Inhalt von GCC“