sabato 24 dicembre 2011

Se Gentoo non trova il compilatore...

Non ho tanta voglia di scrivere questo post, però trovo sia giusto perché tratta una procedura che non si trova facilmente nel web... L'elenco di comandi che troverete non è da considerare oro colato, è sicuramente valida sul mio pc, ma va adeguata alle varie situazioni quindi i novellini non scassino i coglioni se distruggono il proprio sistema per amor del copia-incolla. Si chieda quando non si capisce.

Allora, il problema riscontrabile, che può avere mille cause, è il seguente (compilando qualunque cosa):
checking whether the C++ compiler works... no
configure: error: in `/var/tmp/portage/app-portage/eix-0.23.3-r1/work/eix-0.23.3':
configure: error: C++ compiler cannot create executables
See `config.log' for more details 
E andando a leggere il log del configure (cosa che non fa nessuno) si trova un messaggio simile a questo:
configure:3267: checking whether the C++ compiler works
configure:3289: x86_64-pc-linux-gnu-g++ -march=nocona -O2 -pipe -mssse3  -Wl,-O1 -Wl,--as-needed conftest.cpp  >&5
/usr/libexec/gcc/x86_64-pc-linux-gnu/4.5.3/cc1plus: error while loading shared libraries: /usr/lib64/libgmp.so.10: invalid ELF header
oppure 
configure:3267: checking whether the C++ compiler works
configure:3289: x86_64-pc-linux-gnu-g++ -march=nocona -O2 -pipe -mssse3  -Wl,-O1 -Wl,--as-needed conftest.cpp  >&5
/usr/libexec/gcc/x86_64-pc-linux-gnu/4.5.3/cc1plus: error while loading shared libraries: /usr/lib64/libgmp.so.3: no such file o directory
Sono casi diversi, il secondo potrebbe nascere indipendentemente oppure in seguito alla prima parte di operazioni descritte di seguito. Come dicevo, bisogna adattarsi e capire se può esser un problema collegato a questi casi...

Ora, la soluzione è semplice (certo, dopo che l'ho trovata io) ma delicata. In poche parole si costruisce un nuovo sistema in /mnt, si ricompila gcc e si copiano i file relativi a gmp nel sistema non funzionante:
mkdir /mnt/gentoo
cd /mnt/gentoo
wget http://mirrors.linuxant.fr/distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3/stage3-amd64-20111208.tar.bz2 && wget http://mirrors.linuxant.fr/distfiles.gentoo.org/snapshots/portage-latest.tar.bz2
tar xvjpf stage3-*.tar.bz2
tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr
cp /etc/conf.d/net etc/conf.d /*cambiare l'ip*/
cp /etc/resolv.conf etc/ 
cp /etc/make.conf etc/
mount -t proc none /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash
env-update
source /etc/profile
export PS1="(chroot) $PS1"
eselect profile set x /*scegliere quello che si usa sulla propria installazione gentoo*/
emerge --sync
emerge gcc
exit
cp -ad /mnt/gentoo/usr/lib64/libgmp* /usr/lib64/
Se dovesse servire:
ln -s libgmp.so.10.0.2 libgmp.so.3
in modo che produca questo:
-rw-r--r-- 1 root root 1162942 dic  8 08:03 /usr/lib64/libgmp.a
-rw-r--r-- 1 root root     913 dic  8 08:03 /usr/lib64/libgmp.la
lrwxrwxrwx 1 root root      16 dic 24 09:14 /usr/lib64/libgmp.so -> libgmp.so.10.0.2
lrwxrwxrwx 1 root root      16 dic 24 09:14 /usr/lib64/libgmp.so.10 -> libgmp.so.10.0.2
-rwxr-xr-x 1 root root  456768 dic  8 08:03 /usr/lib64/libgmp.so.10.0.2
lrwxrwxrwx 1 root root      16 dic 24 10:34 /usr/lib64/libgmp.so.3 -> libgmp.so.10.0.2
-rw-r--r-- 1 root root   34530 dic  8 08:03 /usr/lib64/libgmpxx.a
-rw-r--r-- 1 root root     942 dic  8 08:03 /usr/lib64/libgmpxx.la
lrwxrwxrwx 1 root root      17 dic 24 09:14 /usr/lib64/libgmpxx.so -> libgmpxx.so.4.2.2
lrwxrwxrwx 1 root root      17 dic 24 09:13 /usr/lib64/libgmpxx.so.4 -> libgmpxx.so.4.2.2
-rwxr-xr-x 1 root root   18640 dic  8 08:03 /usr/lib64/libgmpxx.so.4.2.2
Non risolve il fatto che vada a cercare una libreria obsoleta, ma aggira il problema facendogli usare quella più recente.

Fatto. Funziona tutto. Sono sempre il migliore.

2 commenti:

Muu? ha detto...

La soluzione "semplice" è reinstallare un sistema ex-novo e ricompilare tutto? Allora quella difficile da dove parte? xD

spillo ha detto...

Ma no, l'unica cosa da compilare è gcc, tutto il procedimento, compilazione esclusa, dura sì e no 10 minuti :P

Il sistema base è composto dallo stage (tar che va estratto)e poi va tutto ricompilato, ma non serve farlo in questa procedura, basta limitarsi al compilatore ;)