“GLIBC” não pode ser usado quando eu tiver instalado o gcc 5.1.0

1

Quando eu instalei o gcc 5.1.0, descobri que muitos dos meus programas não podem ser usados, como o firefox, gnome: eles me fornecerão uma mensagem "GLIBC_2.1X not found". Agora a versão do GLIBC é maior que antes, portanto, esses programas não podem ser usados. Eu acho que é porque a instalação do gcc 5.1.0 torna a versão do GLIBC maior.

O que devo fazer para salvar meu Linux e fazer o gcc para que meu software antigo possa ser usado normalmente?

    
por user5120257 15.07.2015 / 18:50

2 respostas

2

Problema

Você se deparou com o problema da dependência circular, em grande escala. Eu copiei isso de outra das minhas respostas , porque apenas vincular isso não faz justiça. O problema ocorre se você instalou uma versão binária do GCC 5.1.0 ou se a compilou da origem. A discussão abaixo ocorre porque cada pacote no seu sistema, binário ou não, depende implicitamente do GLIBC porque o GLIBC contém os símbolos e os códigos de internacionalização necessários para cada pacote em seu sistema. Os principais exemplos são:

  1. Codificação de idioma
  2. Símbolo de moeda
  3. Formato de data
  4. Formato de contagem
  5. Posição do separador decimal
  6. Tipo de separador, vírgula decimal, etc.

O upgrade do GCC atualiza o GLIBC e o upgrade do GLIBC quebra a lista acima e muito mais. A única maneira de consertar isso é recompilar ou reinstalar cada pacote em seu sistema após atualizar o GCC e o GLIBC, começando com o toolchain - Ubuntu Specific - Binary Distribution Tipos e uma Descrição Geral de um Toolchain .

É quase impossível misturar um pacote baseado em código-fonte em um sistema baseado em pacotes binários, já que você cria facilmente uma incompatibilidade de versão. Considere o seguinte:

  1. Pacote binário A versão A depende e funciona somente com a dependência da versão B. A versão de dependência B usa a biblioteca C.
  2. Conectando a lógica em 1, a versão binária do pacote A também depende implicitamente da biblioteca C.
  3. Você construiu a versão de dependência B com a biblioteca D (Se C = 1.0, D = 1.1)
  4. Dependência Versão B criada com êxito, mas Versão B do Pacote Binário ainda está vinculada à Biblioteca Versão C, portanto o Pacote Binário A agora carrega símbolos não resolvidos, porque os símbolos na Biblioteca Versão C foram substituídos por símbolos mais novos na Versão D.
  5. Biblioteca Versão D, substituída pela Biblioteca Versão C, portanto, o desenvolvedor decidiu não vincular sua nova Versão D à Versão C.
  6. Para corrigir isso, todos os pacotes no sistema, que estão vinculados à biblioteca C, devem ser recompilados usando a Biblioteca Versão D.

Você está preso aqui porque todos os pacotes em um sistema binário foram pré-empacotados e alguns ou todos eles serão quebrados quando compilados da origem

Solução

Tente fazer o downgrade do gcc-5.1.0 e do GLIBC com as ferramentas do gerenciador de pacotes. Se o gerenciador de pacotes não funcionar, seria mais fácil reinstalar sua distribuição do que trabalhar para trás.

    
por 15.07.2015 / 19:54
1

Você pode compilar gcc sem atualizar o GLIBC . Eu fiz isso inúmeras vezes e normalmente você só precisa de uma versão recente do binutils , gmp , mpfr e mpc . Na verdade, isso não tem nada a ver um com o outro. Com isso, quero dizer que não há razão para alterar ou recompilar GLIBC se você alterar sua versão de gcc .

No entanto, se você instalar uma versão gcc que você compilou, nunca faça isso em todo o sistema : isso pode ser tão ruim quanto alterar o GLIBC . Em vez disso, você pode manter uma versão de trabalho de gcc em sua casa e fornecer informações de tempo de execução para vincular às bibliotecas certas (modificando LD_LIBRARY_PATH ).

Agora, GLIBC é compatível com versões anteriores, não compatível com versões anteriores (pelo menos até certo ponto). Se nenhuma atualização GLIBC foi feita por você, isso significa simplesmente que o problema é que a versão gcc que você instalou foi compilada com um novo GLIBC . No meu sistema, firefox , por exemplo, está vinculado a:

linux-vdso.so.1 (0x00007fff92d8a000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007ff8a7711000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff8a750d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ff8a718b000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff8a6e87000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff8a6ae5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff8a792e000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007ff8a68cf000)

e a maioria deles é fornecida por gcc (por isso, o erro GLIBC em firefox , que na verdade é gerado por gcc ).

A segunda possibilidade é que você atualizou GLIBC (dependendo de como você instalou gcc , isso pode ser tão fácil quanto houve uma versão mais recente de GLIBC no repositório que você usou). Nesse caso, isso não deve ser um problema: os programas compilados com versões anteriores de GLIBC devem funcionar com versões mais recentes (até certo ponto). No entanto, alguns programas mantêm referências a versões muito específicas de GLIBC por vários motivos. Então, isso também poderia ser isso.

Para reverter essa bagunça ...

Se você usou um repositório externo e ainda pode instalar pacotes, apenas remova o repositório e faça downgrade.

Se você instalou gcc manualmente, pode sempre tentar reinstalar a versão do repo dele. Mas não tenha muita esperança: você pode precisar reinstalar o seu distrib.

    
por 16.07.2015 / 02:52

Tags