Gentoo Logo

Gentoo GCC-Aktualisierungsanleitung

Inhalt:

1.  Einführung

Aktualisierung von GCC

Wieso sollten Sie aktualisieren? Nun ja, GCC ist jedem anderen Paket auf Ihrem System sehr ähnlich, nur etwas kritischer. Wann immer eine neue Version Fehler beseitigt, die Sie stören, neue Funktionen, die Sie benötigen bereitstellt oder Sie einfach nur aktuell bleiben möchten, sollten Sie GCC aktualisieren. Sollte keiner dieser Fälle auf Sie zutreffen, können Sie die Aktualisierung so lange aufschieben, solange Ihre GCC-Version von den Gentoo Entwicklern unterstützt wird.

Wenn Sie eine neue Hauptversion von GCC installieren (wie von 3.3.6 auf 3.4.5), wird das System diese nicht automatischen benutzen. Sie müssen den Wechsel selbst veranlassen, da die Umstellung einige weitere Schritte benötigen kann. Falls Sie sich dazu entscheiden, nicht zu wechseln, wird Portage weiterhin die alte Version verwenden, außer Sie entscheiden sich zu wechseln oder löschen den alten Compiler von Ihrem System. Bei Aktualisierungen von Unterversionen von GCC (wie von 3.4.5 auf 3.4.6) wird automatisch für Sie gewechselt.

Diese Anleitung beschreibt die nötigen Schritte um eine nahtlose Aktualisierung des von Gentoo benutzten Compilers durchzuführen. Ein Abschnitt widmet sich der Aktualisierung von GCC 3.3 auf 3.4 und Problemen mit libstdc++. Ein weiterer Abschnitt ist spezifisch für Benutzer einer Gentoo Erstinstallation mit einem stage3-Tarball, nachdem eine neue GCC-Version veröffentlicht wurde.

Warnung: Beachten Sie, dass das Aktualisieren von GCC-3.4 (oder 3.3) auf GCC-4.1 oder höher nach wie vor die generellen Aktualisierensanweisung benötigt, da GCC-3.4 und GCC-4.1 leicht unterschiedliche ABIs verwenden.

2.  Generelle Aktualisierungsanleitung

Einführung

Wichtig: Falls Sie nach Anweisungen speziell für das Aktualisieren von GCC-3.3 auf GCC-3.4 suchen, konsultieren Sie bitte diesen Abschnitt.

Wichtig: Falls Sie nach Anweisungen speziell für das Aktualisieren von GCC bei einer neuen Installation suchen, konsultieren Sie bitte diesen Abschnitt.

Generell gesagt, Aktualisieren auf Bug-Fix-Releases wie zum Beispiel von 3.3.5 auf 3.3.6 sollte sicher sein -- emergen Sie einfach die neue Version, wechseln auf diese und erstellen Sie das einzig betroffene Paket, libtool, neu. Allerdings brechen einige Aktualisierungen von GCC binäre Kompatibilität; in solchen Fällen kann ein erneutes Erstellen der betroffenen Pakete (oder sogar der gesamten Toolchain und des Systems) erforderlich sein.

Als wir über die Notwendigkeit des Wechsels auf den neuen Compiler von Hand gesprochen haben, haben wir gesagt, das wird nicht automatisch erfolgen. Allerdings gibt es eine Ausnahme -- Upgrades auf Bug-Fix-Releases, wie von 3.3.5 auf 3.3.6 für den Fall, dass Sie das "multislot" Feature, das es beiden Versionen erlaubt auf einem System zu existieren, nicht verwenden. Multislot ist standardmäßig deaktiviert und die Mehrheit der Benutzer werden keinen Vorteil von dieser Funktion haben.

Befehlsauflistung 2.1: GCC aktualisieren

# emerge -uav gcc

(Bitte ersetzen Sie "i686-pc-linux-gnu-4.1.1" mit der GCC-Version und
den CHOST-Einstellungen auf die Sie aktualisiert haben:) 
# gcc-config i686-pc-linux-gnu-4.1.1
# env-update && source /etc/profile

Falls Sie von gcc 3 auf 4 aktualisiert haben (z.B. von 3.4.6 auf 4.1.1
in diesem Beispiel) müssen Sie fix_libtool_files.sh manuell ausführen
(Ersetzen Sie $CHOST mit Ihrem eigentlichen CHOST, welcher in der
/etc/make.conf zu finden ist)
(Ersetzen Sie <gcc-version> mit Ihrer neuen, aktualisierten
GCC-Version)
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.4.6

(libtool neu erstellen)
# emerge --oneshot -av libtool

Um sicherzugehen, dass das System in einem gesunden Zustand ist, müssen Sie die Toolchain und danach world neu bauen um den neuen Compiler zu nutzen.

Befehlsauflistung 2.2: System neu erstellen

# emerge -eav system
# emerge -eav world

Ab diesem Zeitpunkt ist es sicher, die alte GCC-Version zu löschen. Falls Sie das Bedürfnis haben, führen Sie bitte den folgenden Befehl aus (ersetzen Sie wie üblich =sys-devel/gcc-3.4* durch die Version die Sie löschen möchten):

Befehlsauflistung 2.3: Alte GCC-Version löschen

# emerge -aC =sys-devel/gcc-3.4*

Wichtig: Beachten Sie bitte, dass GCC-4.1 und neuer nur Kernel neuer als 2.4.34 kompilieren kann. Entfernen Sie Ihre alte GCC-Version nicht, wenn Sie einen älteren Kernel verwenden wollen.

Wichtig: Für den Fall, dass Sie von GCC-3.3 aktualisieren, sollten Sie emerge --oneshot sys-libs/libstdc++-v3 ausführen um Kompatibilität mit älteren binären C++ Anwendungen zu gewährleisten.

3.  Aktualisieren von GCC-3.3 auf -3.4

Einführung

Die Aktualisierung von GCC-3.3 auf -3.4 ist nicht so nahtlos, da sich die C++ ABI zwischen diesen beiden Versionen geändert hat. Außerdem gibt es ein Problem mit der libstdc++ Bibliothek auf das ebenfalls Rücksicht genommen werden muss.

Die Möglichkeiten

Wichtig: Falls Sie von gcc-3.4 auf -4.1 aktualisieren, konsultieren Sie bitte die generelle Aktualisierungsanleitung.

Wichtig: Falls Sie auf einem SPARC-Rechner aktualisieren, müssen Sie den Weg des kompletten Systemneubaus aufgrund von internen ABI Änderungen beim Analysieren von GCC Parametern, gehen.

Falls Sie von gcc-3.3 auf -3.4 aktualisieren, haben Sie zwei Möglichkeiten Ihr System zu aktualisieren. Die erste Methode ist schneller und benötigt die Verwendung des revdep-rebuild Tools des gentoolkit Pakets während die zweite Methode das komplette System von Grund auf neu baut um die neuen Funktionen von GCC zu verwenden. Es bleibt Ihnen überlassen, für welche der beiden Varianten Sie sich entscheiden. In den meisten Fällen ist die erste Methode ausreichend.

Falls Sie von gcc 3.3-auf -4.1 aktualisieren, sollten Sie nicht die Methode, die auf revdep-rebuild basiert benutzen, sondern machen Sie einen kompletten Neubau des System.

revdep-rebuild verwenden

Die erste Methode verlangt, dass Sie zuerst gentoolkit installieren, sollten Sie das nicht schon getan haben. Danach werden wir GCC aktualisieren und zur neuen Version wechseln. Wir werden auch das libtool Paket neu bauen, um sicher zu gehen, dass die Toolchain in einem ordentlichen Zustand ist.

Befehlsauflistung 3.1: Installation von gentoolkit und Aktualisierung von GCC

# emerge -an gentoolkit
# emerge -uav gcc
(Bitte ersetzen Sie "i686-pc-linux-gnu-3.4.5" mit der GCC-Version
und den CHOST-Einstellungen auf die Sie aktualisieren:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(libtool neu bauen)
# emerge --oneshot -av libtool

Jetzt wollen wir sehen, welche Pakete revdep-rebuild neu bauen will. Danach werden wir revdep-rebuild sagen, dass es diese Pakete neu bauen soll. Das wird eine Weile dauern, also haben Sie etwas Geduld.

Befehlsauflistung 3.2: Verwendung von revdep-rebuild

# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Notiz: Es ist möglich, dass Sie Probleme mit nicht existierenden Paketversionen haben, da diese eventuell veraltet oder maskiert sind. Sollte das der Fall sein, verwenden Sie die --package-names Option von revdep-rebuild. Das veranlasst, dass die Pakete basierend auf dem Paketnamen, anstatt des genauen Namens und der Version, neu gebaut werden.

Um die Kompatibilität zu älteren C++ Binärapplikationen und Paketen die revdep-rebuild ausgelassen hat zu erhalten, muss sys-libs/libstdc++-v3 emerged werden, bevor Sie GCC-3.3 von Ihrem System entfernen.

Befehlsauflistung 3.3: libstdc++-v3 installieren und aufräumen

# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*

emerge -e verwenden

Diese Methode, obwohl um einiges langsamer, wird Ihr gesamtes System neu bauen, um sicherzustellen, dass Alles mit Ihrem neuen Compiler neu gebaut wurde und ist daher viel sicherer. Zuerst aktualisieren Sie GCC und libtool und wechseln zu Ihrem neuen Compiler.

Befehlsauflistung 3.4: GCC aktualisieren

# emerge -uav gcc
(Bitte ersetzen Sie "i686-pc-linux-gnu-3.4.5" mit der GCC-Version und
den CHOST-Einstellungen auf die Sie aktualisiert haben:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

Falls Sie von gcc 3 auf 4 aktualisiert haben (z.B. von 3.4.6 auf 4.1.1
in diesem Beispiel) müssen Sie fix_libtool_files.sh manuell ausführen
(Ersetzen Sie $CHOST mit Ihrem eigentlichen CHOST, welcher in der
/etc/make.conf zu finden ist)
(Ersetzen Sie <gcc-version> mit Ihrer neuen, aktualisierten
GCC-Version)
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6

(libtool neu bauen)
# emerge --oneshot -av libtool

Um die Kompatibilität mit älteren C++ Binärapplikationen zu gewährleisten, muss sys-libs/libstdc++-v3 auf Ihrem System installiert werden.

Befehlsauflistung 3.5: libstdc++-v3 installieren

# emerge --oneshot sys-libs/libstdc++-v3

Jetzt werden wir dazu übergehen, zuerst das system-Ziel und dann das world-Ziel neu zu bauen. Das wird sehr lange dauern, abhängig von der Anzahl der Pakete die Sie installiert haben, da es Ihre komplette Toolchain und unterstützenden Systemdateien neu erstellen wird, gefolgt von jedem Paket auf Ihrem System, inklusive der Toolchain. Das ist nötig, um sicher zu stellen, dass alle Pakete mit dem neuen Compiler gebaut wurden, inklusive der Toolchain selbst.

Befehlsauflistung 3.6: system und world neu bauen

# emerge -e system
# emerge -e world

Ab diesem Zeitpunkt ist es sicher, alte GCC-Versionen zu entfernen:

Befehlsauflistung 3.7: Aufräumen

# emerge -aC =sys-devel/gcc-3.3*

4.  Aktualisieren von GCC bei einer Erstinstallation

Einführung

Eine GCC-Aktualisierung auf einem System nach einer stage3-Tarball-Installation ist eine einfache Angelegenheit. Ein Vorteil die Benutzer einer neuen Installation haben, ist, dass diese nicht massenhaft Software installiert haben, die gegen die alte Version von GCC gelinkt ist. Das folgende Beispiel ist für eine GCC-3.3 auf -3.4 Aktualisierung. Einige Abschnitte sind eventuell unterschiedlich falls Sie von anderen Versionen aktualisieren. Zum Beispiel die benutzten Bibliothekennamen von revdep-rebuild unter GCC-3.3 im speziellen, sowie der Bedarf libstdc++-v3 zu installieren.

Wenn ein Benutzer an seinem System noch keine Änderungen vorgenommen hat, sind es nur einige wenige Schritte um das System auf eine neue GCC Version zu aktualisieren. Wie bei der GCC-3.3 auf -3.4 Aktualisierung hat der Benutzer einige Möglichkeiten. Allerdings ist die Aktualisierung von GCC-3.4 auf -3.4 weniger kompliziert, da es hier geringere Unterschiede zwischen den Methoden gibt. Die erste Methode ist schneller und benutzt das revdep-rebuild Werkzeug von gentoolkit, gleich wie das obige Verfahren. Die Benutzung von revdep-rebuild bewirkt nur das neu Bauen von Paketen die gegen GCC-Bibliotheken gelinkt sind, während die zweite Methode Ihre ganze neue Installation mit der neuen GCC-Version neu kompiliert und dauert daher viel länger. Die zweite Methode ist nie notwendig und ist nur der Vollständigkeit halber dokumentiert.

Diese ersten Schritte haben beide Methoden gemeinsam und sollten von jedem durchgeführt werden.

Befehlsauflistung 4.1: GCC aktualisieren

# emerge -uav gcc
(Bitte ersetzen Sie "i686-pc-linux-gnu-3.4.5" mit der GCC-Version und
den CHOST-Einstellungen auf die Sie aktualisiert haben:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(libtool neu bauen)
# emerge --oneshot -av libtool

Um die Kompatibilität zu älteren C++ Binärprogrammen zu gewährleisten, muss sys-libs/libstdc++-v3 auf Ihrem System installiert werden.

Befehlsauflistung 4.2: libstdc++-v3 installieren

# emerge --oneshot sys-libs/libstdc++-v3

Verwendung von revdep-rebuild

Diese Methode verlangt, dass Sie zuerst gentoolkit installieren, sollten Sie das nicht bereits getan haben. Wir führen revdep-rebuild aus, um die installierten Pakete nach jenen zu durchsuchen, die neu gebaut werden müssen, danach werden diese neu gebaut.

Befehlsauflistung 4.3: Installation von gentoolkit und Aktualisierung von GCC

# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Notiz: Es ist möglich, dass Sie Probleme mit nicht existierenden Paketversionen haben, da diese eventuell veraltet oder maskiert sind. Sollte das der Fall sein, verwenden Sie die --package-names Option von revdep-rebuild. Das veranlasst, dass die Pakete basierend auf dem Paketnamen, anstatt des genauen Namens und der Version, neu gebaut werden.

Verwendung von emerge -e

Diese Methode ist viel langsamer, baut aber das ganze System neu, um sicherzustellen, dass alles mit Ihrem aktualisierten Compiler neu gebaut wurde. Das ist nicht nötig, aber zuverlässig falls Sie auch Ihre CFLAGS oder andere make.conf Variablen, die den Kompiliervorgang beinflussen, ändern.

Da wir diese Aktionen nach einer Erstinstallation durchführen, müssen wir das world Ziel nicht neu bauen, wie wir es bei einer Aktualisierung eines bereits installierten Systems tun würden. Es steht Ihnen jedoch frei eine Aktualisierung von world anstatt von system durchführen, um sicherzustellen, dass alle Pakete aktualisiert wurden.

Befehlsauflistung 4.4: System neu bauen

# emerge -e system

Aufräumen

Ab diesem Zeitpunkt ist es sicher, die alte GCC-Version zu löschen. Bitte ersetzen Sie IHRE-NEUE-GCC-VERSION mit der Version auf die Sie aktualisiert haben:

Befehlsauflistung 4.5: Aufräumen

# emerge -aC "<sys-devel/gcc-IHRE-NEUE-GCC-VERSION"

5.  Bekannte Stolpersteine

Es ist wichtig, distcc während der Aktualisierung zu deaktivieren. Compilerversionen auf Ihrem Host zu mischen, wird Probleme beim Bauen verursachen. Für ccache ist das nicht nötig, da die Cache Objekte ohnehin ungültig werden.

Benutzen Sie immer dieselbe GCC-Version für Ihre Kernel und zusätzliche Kernelmodule. Nachdem Sie Ihr world mit dem GCC neu gebaut haben, werden sich externe Module (wie app-emulation/qemu-softmu) nicht mehr laden lassen. Bitte bauen Sie Ihren Kernel mit dem aktualisierten GCC neu, um das Problem zu beheben.

Falls Sie auf einem SPARC-Rechner aktualisieren, stellen Sie sicher, silo -f nach dem Neubauen von world auszuführen, um mögliche Probleme zu vermeiden.

Häufige Fehlermeldungen

Falls sich Ihr System über etwas wie libtool: link: `/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid libtool archive beschwert, führen Sie bitte /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6 aus (ersetzen Sie "3.3.6" durch die Versionsnummer aus der Fehlermeldung, und $CHOST und <gcc-version> mit Ihrem eigentlichen CHOST und Ihrer GCC-Version).

Falls Sie error: /usr/bin/gcc-config: line 632: /etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory sehen, versuchen Sie /etc/env.d/gcc/config-i686-pc-linux-gnu zu löschen und gcc-config gefolgt von source /etc/profile erneut auszuführen. Tun Sie dies jedoch nur, wenn Sie keinen Cross-Compiler eingerichtet haben.

Falls ein Paket während emerge -e system oder emerge -e world fehlschlägt, können Sie die Operation mit emerge --resume fortsetzen. Falls ein Paket wiederholt fehlschlägt, überspringen Sie es mit emerge --resume --skipfirst. Führen Sie inzwischen keine weitere Instanz von emerge aus, da Sie sonst die resume Informationen verlieren.

Falls Sie eine Fehlermeldung spec failure: unrecognized spec option während der Aktualisierung Ihres Compilers bekommen, versuchen Sie auf Ihren Standardcompiler zurück zu wechseln, entfernen Sie die GCC_SPECS Variable und aktualisieren Sie GCC erneut:

Befehlsauflistung 5.1: Primärspezifikationen wiederherstellen

# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc


Drucken

Seite aktualisiert 19. Juli 2008

Die Originalversion dieser Übersetzung wird nicht länger gepflegt

Zusammenfassung: Dieses Dokument führt den Benutzer durch den Prozess einer GCC-Aktualisierung.

Wernfried Haas
Autor

Jan Kundrát
Autor

Mark Loeser
Bearbeiter

Joshua Saddler
Bearbeiter

Stefan Kienzl
Übersetzer

Tobias Heinlein
Übersetzer

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.