Como corrigir o libstdc ++ 6 quebrado, que também quebra o apt

6

Parece que eu atrapalhei algo com uma atualização gcc manual em algum momento no passado, o que não se tornou um problema até hoje, quando atualizei de 14.04 para 16.04. Ou seja, o sistema parece pensar que a versão libstdc++6 está OK, enquanto apt (e muitos outros programas) reclamam que não é (porque a biblioteca compartilhada está na versão errada):

sudo apt-get install --fix-broken --fix-missing
apt-get: relocation error: /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0: symbol _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareERKS4_, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

O sistema nem inicia um modo gráfico, a saída acima foi obtida usando um console não-gráfico (usando Ctrl-Alt-F6 ), e apt em si é completamente inutilizável, então eu não posso simplesmente fazer algo como uma reinstalação.

Como posso corrigir e reinstalar esses pacotes quando o programa que estou usando para gerenciá-los é afetado e inutilizável?

    
por phg 30.08.2016 / 18:25

1 resposta

6

Primeiramente, eu consegui um shell de login gráfico copiando manualmente libstdc++.so.6.0.21 em seu lugar a partir de um pendrive USB e criando um link para ele a partir de libstdc++.so.6 . Eu usei essa versão exata porque parece ser o padrão para o Ubuntu 16.04 e também contém o "21" mencionado na mensagem de erro ("versão GLIBCXX_3.4.21").

Enquanto isso parecia satisfazer a pilha de gráficos, os mesmos erros permaneceram com apt e outros programas dependendo do libstdc ++ 6. Depois de algumas tentativas, consegui resolver tudo com os seguintes passos, usando dpkg para manualmente (des) instalar coisas:

  • Faça o download dos arquivos deb nas versões corretas para o 16.04:

    wget http://mirrors.kernel.org/ubuntu/pool/main/a/apt/apt_1.2.10ubuntu1_amd64.deb http://mirrors.kernel.org/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.4_amd64.deb
    
  • Removendo esta versão específica, que bloqueou a instalação da versão correta da libstdc ++ 6:

    sudo dpkg --force-depends -r libstdc++6:i386
    
  • Em seguida, instale a versão "boa" dos arquivos:

    sudo dpkg -i libstdc++6_5.4.0-6ubuntu1~16.04.4_amd64.deb apt_1.2.10ubuntu1_amd64.deb
    
  • E, finalmente, corrija a bagunça que deixei enquanto atualizava e experimentava:

    sudo apt-get install -f
    
por phg 30.08.2016 / 18:25