Installieren von GCC-3.3.1 - Durchlauf 2

Geschätzte Kompilierzeit:              11.0 SBU
Ungefähr benötigter Festplattenplatz:  274 MB

Neuinstallation von GCC

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:

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.