Estou conectado com SSH a uma máquina na qual não tenho acesso root. Para instalar algo, carreguei bibliotecas da minha máquina e coloquei-as no ~/lib
diretório do host remoto.
Agora, para quase todos os comandos que executo, recebo o erro abaixo (o exemplo é para ls
) ou uma Segmentation fault (core dumped)
mensagem.
ls: relocation error: /lib/libpthread.so.0: symbol __getrlimit, version
GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
Os únicos comandos que consegui executar com sucesso são cd
e pwd
até agora. Posso encontrar arquivos em um diretório usando TAB para autocomplete ls
, para poder percorrer os diretórios.
uname -r
também retorna a Segmentation fault (core dumped)
mensagem, então não tenho certeza de qual versão do kernel estou usando.
Responder1
Como você pode fazer login, nada importante será quebrado; presumivelmente, os scripts de inicialização do seu shell são adicionados ~/lib
ao LD_LIBRARY_PATH
, e isso, junto com as bibliotecas ruins no ~/lib
, é o que causa os problemas que você está vendo.
Para corrigir isso, execute
unset LD_LIBRARY_PATH
Isso permitirá que você execute rm
, vim
etc. para remover as bibliotecas problemáticas e editar seus scripts de inicialização, se apropriado.
Responder2
O problema é que você colocou uma cópia glibc
em seu ~/lib
diretório e essa biblioteca é incompatível com o sistema para o qual você a carregou. A biblioteca está sendo referenciada conforme ~/lib
especificado em $LD_LIBRARY_PATH
.
Para corrigir isso temporariamente, simplesmente unset LD_LIBRARY_PATH
- isso funcionará como unset
um shell integrado. Você poderá então executar seu editor de texto favorito para remover tudo o que está em seus arquivos de inicialização que está configurando a variável em primeiro lugar.
Responder3
O que encontrei no Linux Yocto Sumo v4.14, mas deve ser idêntico a todos os kernels do Linux:
- Você pode alternar entre 2 versões das principais bibliotecas, em /lib a padrão e /usr/lib a postagem do usuário instalada ou pós-anexada.
- Para isso basta definir a variável LD_LIBRARY_PATH em cada comando. Ou, alternativamente, chame a exportação desde o início, ou seja
export LD_LIBRARY_PATH=/lib
# now everything should work again since there should
be a valid backup version of glibc in /lib
# try use a command again
ls ./
#if this works you can overwrite the broken version of glibc in /usr/lib
cp -faL /lib/libc.so* /usr/lib/
cp -faL /lib/libc-*so* /usr/lib/
#should be optional but for the sake of completeness, as the libc package
# installs all of the following:
# direct dependencies and are versioned using
# the same version number as glibc
cp -faL /lib/ld*.so* /usr/lib/
cp -faL /lib/libdl*.so* /usr/lib/
cp -faL /lib/libm*.so* /usr/lib/
cp -faL /lib/libnsl*.so* /usr/lib/
cp -faL /lib/libnss*.so* /usr/lib/
cp -faL /lib/librt*.so* /usr/lib/
cp -faL /lib/libutil*.so* /usr/lib/
cp -faL /lib/libpthread*.so* /usr/lib/
cp -faL /lib/libcrypt*.so* /usr/lib/
cp -faL /lib/libresolv*.so* /usr/lib/
Isso deve funcionar!