Guida all'aggiornamento di GCC per Gentoo
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
|
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|