Gentoo Logo

Guida all'aggiornamento di GCC per Gentoo

Indice:

1.  Avvio rapido

Introduzione

La guida è incentrata sull'aggiornamento di GCC. Effettuare il downgrade di GCC potrebbe avere degli effetti indesiderati. Per favore consultare Risoluzione dei problemi per i problemi più comuni segnalati.

La sezione successiva fornisce una introduzione agli aggiornamenti di GCC (e di quanto siano semplici). Se si vuole leggere la spiegazione dettagliata dietro gli aggiornamenti di GCC, per favore continuare con L'aggiornamento di GCC in dettaglio.

Versione rapida

Se si sta aggiornando GCC non c'è bisogno di effettuare nessuna operazione, tranne cambiare la versione del compilatore e ricompilare libtool:

Codice 1.1: Cambiare versione di GCC

# emerge -u gcc
# gcc-config -l

[1] i686-pc-linux-gnu-4.4.5 *
[2] i686-pc-linux-gnu-4.5.3

# gcc-config 2
env-update && source /etc/profile
emerge --oneshot libtool

Se si sta aggiornando GCC da una versione precedente la 3.4.0 (per la serie 3.x) oppure la 4.1, è necessario eseguire revdep-rebuild:

Codice 1.2: Aggiornamento da una versione di GCC non compatibile in avanti

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

Ecco fatto. Il nuovo compilatore è pronto per l'uso!

2.  L'aggiornamento di GCC in dettaglio

Introduzione

L'aggiornamento di GCC è sempre stato mistificato, con suggerimenti che spaziano da "Non c'è bisogno di fare nulla" a "È necessario ricompilare il sistema due volte". Molte di queste affermazioni derivano dalla confusione che circonda le incompatibilità ABI. Ma prima è necessario dare un'occhiata a libtool.

libtool e fix_libtool_files.sh

Le installazioni precedenti di GCC su Gentoo richiedevano l'esecuzione di un comando specifico chiamato fix_libtool_files.sh. Non molto tempo fa l'esecuzione di questo comando è stata integrata nell'applicazione dello stesso pacchetto (tramite l'eclass toolchain) per cui non è più necessario per gli utenti eseguire questo comando.

Il motivo per cui è necessario ricompilare libtool dopo l'aggiornamento delle versioni di GCC sta nel suo obiettivo principale: libtool è un insieme di strumenti che aggrega il codice specifico della piattaforma in una interfaccia generica, consentendo alle applicazioni di essere compilate con le librerie condivise senza la necessità di avere a che fare con gli aspetti specifici delle librerie condivise per la piattaforma. Al fine di svolgere correttamente la sua funzione, lo script libtool fa uso di alcune posizioni delle librerie che hanno delle informazioni pre-impostate (hardcoded) sulla versione di GCC.

Cambiamenti ABI

Una ABI, o Application Backend Interface, è un insieme di convenzioni usate da tutti gli strumenti che hanno a che fare con la rappresentazione binaria dei programmi inclusi compilatori, assembler, linker ed il supporto alla fase di esecuzione di un programma (fonte: GCC Binary Compatibility). Quando la ABI usate per le applicazioni binarie e le librerie viene modificata, si corre il rischio di ricevere errori del linker o programmi malfunzionanti a meno che non vengano ricompilate tutte le librerie che fanno uso di codice C++. Sì, C++, dato che molte delle incompatibilità si verificano a causa della ABI C++. Si tratta di un altro motivo per cui viene usato il comando revdep-rebuild verso la libreria libstdc++.so.5.

Codice 2.1: Ricompilare le applicazioni collegate a libstdc++.so.5

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

Allora perché questo è necessario fino alle versioni di GCC 3.4.0/4.1? Perché da quelle specifiche versioni in poi, GCC utilizza una ABI compatibile in avanti, la quale elimina la necessità di ricompilare applicazioni e librerie. Ovviamente, non ci sono garanzie assolute, ma nel caso in cui dovesse verificarsi una incompatibilità, essa verrà documentata qui ;-) In quel caso, la versione della libreria libstdc++.so verrà probabilmente incrementata.

Ricompilare l'intero sistema

Alcune persone giurano di aver bisogno di ricompilare ogni singolo pacchetto sul proprio sistema quando è disponibile una nuova versione di GCC. Ovviamente, tutto ciò non ha senso, dato che ci sono molte applicazioni che non richiedono GCC sia per essere compilate che per il processo di installazione, per cui non verranno interessate da tali modifiche.

Ciò non vuol dire che abbiano del tutto torto: le versioni più recenti di GCC spesso includono un supporto migliorato al set di istruzioni dei processori, il che potrebbe influenzare le performance di alcune applicazioni in maniera del tutto positiva. Nonostante questo miglioramento sia solitamente marginale, in alcuni casi (specialmente le applicazioni che fanno uso intensivo della CPU) potrebbero portare significativi miglioramenti.

Esistono anche dei casi noti dove i pacchetti necessitano di essere compilati con lo stesso compilatore. Nonostante questi pacchetti vengano aggiornati contemporaneamente da Gentoo (in modo da esser compilati sempre con la stessa versione di GCC) la reinstallazione di questi pacchetti potrebbe rivelarsi problematica. I vari pacchetti qt-* sono un classico esempio di questo comportamento.

3.  Risoluzione dei problemi

libstdc++.so.6: version `GLIBCXX_3.4.15' not found

Durante gli aggiornamenti, potrebbe verificarsi un errore come il seguente:

Codice 3.1: GLIBCXX_x.y.z not found

cmake_bootstrap_28021_test: /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/libstdc++.so.6:
version `GLIBCXX_3.4.11' not found

Ciò vuol dire che si sta tentando di compilare un pacchetto con una versione di GCC più vecchia rispetto quella utilizzata per compilare alcune delle dipendenze. È vero che l'ABI C++ è compatibile in avanti, ma fa in modo che vengano usate solo versioni successive (o identiche) di GCC per compilare applicazioni e librerie collegate (rispetto alla versione di GCC usata per compilare tali librerie).

Quali sono i pacchetti che necessitano di essere ricompilati?

La seguente tabella indica i pacchetti che, se installati, hanno bisogno di essere ricompilati, specificando il perché.

Pacchetto Ricompilazione necessaria perché...
sys-devel/libtool l'applicazione libtool ha percorsi pre-impostati verso le librerie interne di GCC
dev-lang/ghc l'applicazione ghc ha percorsi pre-impostati verso le librerie interne di GCC


Stampa

Aggiornato il 15 ottobre 2011

La versione originale di questo documento non è più mantenuta

Oggetto: Questo documento guida gli utenti attraverso il processo di aggiornamento di GCC.

Sven Vermeulen
Autore

Federico Della Ricca
Traduzione

Donate to support our development efforts.

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