How-to : Compiler gcc-3.3
Voila un bon article pour commencer !
La compilation de gcc-3.3 peut s’avérer nécessaire, par exemple pour compiler des programmes utilisant des librairies ayant été compilées avec une ancienne version de la librairie standard C++. (GCC, à partir de sa version 3.4 utilise la version 6 de la librairie C++). En plus, sous Ubuntu, Gcc est disponible dans les paquets qu’à partir de sa version 3.4.
Bon, c’est parti :
1ere étape : téléchargement des sources : ftp://ftp.ironie.org/ftp.gnu.org/pub/gnu/gcc/gcc-3.3/gcc-3.3.tar.gz
On les extrait sur le desktop, ce qui donne le répertoire gcc-3.3. Il faut crée un répertoire « obj » sur le desktop, car la compilation doit avoir lieu dans un autre répertoire que les fichiers sources.
2nde étape : installer gcc-3.4 qui est disponible dans les paquets :
sudo apt-get install gcc-3.4
En effet, gcc-3.3 ne peut pas être compilé avec des versions récentes de gcc (>= 4.0) : (Casts as lvalue have been deprecated already in GCC 3.4 and removed in 4.0, see http://gcc.gnu.org/gcc-4.0/changes.html. )
On tombe sur l’erreur ./read-rtl.c:653: error: lvalue required as increment operand
make[1]: *** [read-rtl.o] Error 1 si on compile avec une version trop récente.
Ensuite : cd ~/Desktop/obj
Pour que le script de configuration comprenne qu’on veut compiler avec gcc-3.4, on saisit : export CC=gcc-3.4
puis : ../configure –enable-shared -enable-threads lance le script de configuration qui va créer les makefiles.
Après : make bootstrap pour lancer la compilation. C’est long, prévoir une 1 heure.
Ensuite pour installer : sudo make install
Gcc3.3 est donc installé dans /usr/local/bin. D’ailleurs un cd /usr/local/bin; ./gcc -v doit donner :
Lecture des spécification à partir de ./../lib/gcc-lib/i686-pc-linux-gnu/3.3/specs
Configuré avec: ../gcc-3.3/configure –enable-shared -enable-threads
Modèle de thread: posix
version gcc 3.3
Remarque 1 :
Apparemment le répertoire /usr/local/bin s’ajoute tout seul dans le path, et du coup la commande gcc appel gcc-3.3 et non gcc-4.3. Pour s’apercevoir de ça, il faut lancer un nouveau terminal et taper gcc -v.
Pour éviter cela : faire echo $PATH . Ça doit donner quelque chose comme :
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/excite-tools/bin:/usr/lib:.
solution: Il faut copier coller cette ligne et taper : gedit ~/.bashrc puis, en bas mettre :
export PATH=[la ligne moins le chemin en rouge]
Sauvegarder, fermer puis taper : source ~/.bashrc pour que les changements prennent effet.
Maintenant, nous allons créer deux liens symboliques :
sudo ln -s /usr/local/bin/gcc /usr/bin/gcc-3.3
sudo ln -s /usr/local/bin/g++ /usr/bin/g++-3.3
Maintenant un gcc-3.3 -v et g++-3.3 -v montrent bien que l’on appel la version 3.3.
Par contre un gcc -v et g++ -v doivent continuer d’appeler la version 4.3.
Remarque 2 :
J’ai eu après un problème bizarre, apparemment un conflit engendré par la création des librairies partagées de gcc-3.3. On ne pouvait plus lancer certains programmes comme apt-get, telnet, etc et on obtenait l’erreur (obscure) suivante :
sudo apt-get install gedit-plugins
apt-get: /usr/local/lib/libgcc_s.so.1: version `GCC_4.2.0′ not found (required by /usr/lib/libstdc++.so.6)
Pourtant un ldd /usr/lib/libstdc++.so.6 montre bien que la shared librairie libgcc_s.so.1 est trouvée.
linux-gate.so.1 => (0xb7f98000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7e82000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d24000)
/lib/ld-linux.so.2 (0xb7f99000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7d15000)
J’ai donc fait un sudo find /usr /lib -user root -name “libgcc_s.so*” -exec ls -l {} \;
lrwxrwxrwx 1 root root 13 2009-02-18 15:28 /usr/local/lib/libgcc_s.so -> libgcc_s.so.1
-rw-r–r– 1 root root 766676 2009-02-18 15:28 /usr/local/lib/libgcc_s.so.1
lrwxrwxrwx 1 root root 18 2009-02-18 14:21 /usr/lib/gcc/i486-linux-gnu/3.4.6/libgcc_s.so -> /lib/libgcc_s.so.1
lrwxrwxrwx 1 root root 20 2009-02-18 14:21 /usr/lib/gcc/i486-linux-gnu/3.4.6/64/libgcc_s.so -> /lib64/libgcc_s.so.1
lrwxrwxrwx 1 root root 20 2009-02-18 14:21 /usr/lib/gcc/i486-linux-gnu/3.4.6/64/libgcc_s_64.so -> /lib64/libgcc_s.so.1
lrwxrwxrwx 1 root root 20 2009-02-18 14:21 /usr/lib/gcc/i486-linux-gnu/3.4.6/libgcc_s_64.so -> /lib64/libgcc_s.so.1
lrwxrwxrwx 1 root root 18 2009-02-17 14:43 /usr/lib/gcc/i486-linux-gnu/4.3/libgcc_s.so -> /lib/libgcc_s.so.1
lrwxrwxrwx 1 root root 18 2009-02-20 15:55 /usr/lib/libgcc_s.so.1 -> /lib/libgcc_s.so.1
-rw-r–r– 1 root root 54740 2009-01-23 21:14 /lib/libgcc_s.so.1
J’ai constaté que seule la librairie /usr/local/lib/libgcc_s.so.1 (en rouge) n’était pas un lien symbolique sur /lib/libgcc_s.so.1. (Cette librairie a donc due être crée lors de la compilation de gcc-3.3 ??) et je l’ai donc remplacé par un lien symbolique comme les autres :
sudo mv /usr/local/lib/libgcc_s.so.1 /usr/local/lib/libgcc_s.so.1.old
sudo ln -s /lib/libgcc_s.so.1 /usr/local/lib/libgcc_s.so.1
Depuis, apt-get, telnet et autres remarchent, même si j’ai pas vraiment compris ce qu’il s’est passé…
Bon en fait le problème vient de la commande ldconfig qui établit des liens symboliques vers des librairies et qui se trompe et établit le mauvais lien. Le problème apparaît donc à chaque fois que ldconfig est lancée, c’est à dire très souvent (puisque la commande est lancée à chaque fois qu’on installe un paquet).
Du coup, pour contourner le problème, il faut faire comme suit :
cd /sbin
sudo mv ldconfig commandeldconfig
sudo gedit
Coller le script suivant et l’enregistrer dans /sbin, sous le nom ldconfig :
#!/bin/sh
commandeldconfig
echo “Lien incriminé :\n”
ls -l /usr/local/lib/libgcc_s.so.1
ln -sf /lib/libgcc_s.so.1 /usr/local/lib/libgcc_s.so.1
echo “\nLien Rétablie :\n”
ls -l /usr/local/lib/libgcc_s.so.1
echo “\n”
Il faut maintenant lui donner les droits d’exécutions :
sudo chmod a+x /sbin/ldconfig .
voila, un appel à ldconfig ira maintenant exécuter notre script, qui va lancer la vraie commande ldconfig et va automatiquement changer le lien erroné, sans interventions de notre part.
Et voila !
Ecrit par apesle le 27 mars 2009 :: Classé dans Gcc
Tags :: Gcc, gcc-3.3
