Header Ads

Como trabalhar com dependências de objetos compartilhados (biblioteca) no Linux

Dima Polies / Shutterstock. com

Erro ao carregar bibliotecas compartilhadas: o erro temido que todo usuário Linux encontrará mais cedo ou mais tarde. Algo deu errado com as dependências de objetos compartilhados (as bibliotecas) usadas pelo executável. Aprenda como corrigir esses problemas e muito mais!

O que é uma dependência de objeto compartilhado?

Um objeto compartilhado (também chamado de biblioteca) é um binário (geralmente não executável diretamente) usado por vários programas / aplicativos em uma instância do Linux. Essas bibliotecas são frequentemente instaladas no nível do sistema operacional e são compartilhadas (daí o nome de objeto compartilhado ou bibliotecas) para uso por um ou mais (e até mesmo muitos) aplicativos executáveis ​​diretamente.

Por exemplo, um programa que apresenta a compactação de arquivos pode exigir a biblioteca bz2 (bzip2) libbz2. so.1.0 para fazer isso. O termo biblioteca é usado com mais frequência nos círculos do Linux e é o jargão preferido entre os profissionais, embora objeto compartilhado (e biblioteca compartilhada) sejam ambos tecnicamente corretos. Também interessante notar é que a extensão de nome de arquivo . so usada em muitas bibliotecas significa objeto compartilhado!

Um executável pode ter zero, uma ou várias bibliotecas das quais depende. Quanto menos bibliotecas, mais avançada (ao atualizar seu sistema operacional, por exemplo) será a compatibilidade. Quanto mais bibliotecas, maior a chance de que, mais cedo ou mais tarde, alguma dependência da biblioteca seja interrompida. É também por isso que os fornecedores de aplicativos às vezes decidem lançar binários compilados estaticamente em vez de binários compilados dinamicamente.

A diferença entre binários compilados estaticamente e dinamicamente é simples, mas tem consequências de longo alcance. Um binário compilado estaticamente tem as bibliotecas (disponíveis no sistema do desenvolvedor no momento da compilação) compiladas no binário / executável resultante. Um binário compilado dinamicamente usará as bibliotecas instaladas, disponíveis e compartilhadas no sistema do usuário.

Como você pode ver imediatamente, isso exigiria que o usuário instale qualquer uma das dependências necessárias, a menos que o mesmo seja feito no sistema operacional ou no sistema de gerenciamento de pacotes do fornecedor do aplicativo e nos detalhes. É por isso que a execução de um comando simples como sudo apt install ... some_app ... frequentemente produzirá um conjunto de outras coisas relacionadas (ou seja, bibliotecas necessárias) para serem co-instaladas ao mesmo tempo.

Tanto a compilação estática quanto a dinâmica têm prós e contras. Por exemplo, se você usa compilação estática, e uma biblioteca que você incluiu em seu pacote de software (da perspectiva de um fornecedor de software) agora tem um bug de segurança ou atualização crítica, isso provavelmente significará que você precisa - libere seu pacote de software, mesmo que nada tenha mudado em seu código.

Publicidade

Mas, novamente, contar com o usuário para instalar bibliotecas, especialmente para programas complexos, ou quando a auto-compilação de software é necessária, com a percepção de que os usuários finais muitas vezes lutam com essas coisas, também não é ideal . É uma área complexa e o problema já foi discutido com frequência.

Para os fins deste artigo, examinaremos as bibliotecas compartilhadas em conexão com um programa que foi compilado dinamicamente, como costuma ser o caso com programas / executáveis ​​/ ferramentas do sistema operacional. Com programas compilados estaticamente (que são menos comuns), um erro como & # 8216; Erro ao carregar bibliotecas compartilhadas &’ é altamente improvável de ser exibido, já que as bibliotecas estão incluídas no executável, a menos que o programa seja parcialmente dinâmico e inclua apenas um conjunto limitado de bibliotecas estáticas integradas.

Erro ao carregar bibliotecas compartilhadas!

Vamos mudar para o modo raiz por um tempo (usando sudo su) e explorar como as bibliotecas compartilhadas funcionam quando se trata de uma ferramenta como / usr / bin / zip que está incluída ou instalável com os principais Linux distribuições.

Aqui, mudamos os diretórios para / usr / bin e verificamos se o programa zip / binário / executável está presente. Ao encontrá-lo presente, verificamos a versão chamando-o com --version e pegando apenas as duas primeiras linhas da saída canalizando a saída (usando |) para evitar a saída longa fornecida de outra forma.

Finalmente, usamos a ferramenta ldd (um programa que imprime dependências de objetos compartilhados) para ver quais bibliotecas o executável requer. Como podemos ver, o programa requer quatro bibliotecas compartilhadas. A lista de bibliotecas necessárias geralmente está no formato da biblioteca necessária, seguida por um caminho onde a biblioteca nomeada já foi encontrada.

Publicidade

Para algumas bibliotecas de nível superior ou de nível de sistema operacional especial (como linux-vdso. so.1), esse caminho não é mostrado. No entanto, desde que nenhum erro seja exibido para qualquer entrada, você sabe que está tudo bem e disponível (ou preferível). Na verdade, linux-vdso. so.1 é um objeto / biblioteca virtual compartilhado especial injetado em todos os processos pelo kernel do Linux, que não possui um arquivo físico em disco para o mesmo. Ele existe para tornar as chamadas de sistema mais eficientes.

Então, vamos interromper um pouco as coisas e renomear uma das bibliotecas necessárias para que ela não possa mais ser descoberta automaticamente pelo binário:

Como você pode ver, aqui, renomeamos / movemos o arquivo de /lib/x86_64-linux-gnu/libbz2. so.1.0 para /lib/x86_64-linux-gnu/libbz2. so.1.0. NOT_PRESENT. Isso quebrou nosso aplicativo zip e, quando tentamos executá-lo, recebemos o erro temido ao carregar as bibliotecas compartilhadas. Olhando um pouco mais de perto, a mensagem de erro é bastante descritiva, no entanto:

 zip: erro ao carregar bibliotecas compartilhadas: libbz2. so.1.0: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório 

Um engenheiro de TI experiente sempre revisará cuidadosamente todos os registros e resultados / informações do programa apresentados a ele antes de fazer uma chamada sobre um problema. Também valeria a pena aqui, pois o arquivo necessário é mostrado claramente, libbz2. so.1.0, e o problema também é mostrado claramente. Esse arquivo ou diretório não existe. Em outras palavras, libbz2. so.1.0 está faltando!

Também podemos verificar o mesmo com o ldd, como pode ser visto na imagem acima. Uma libbz2. so.1.0 = > não encontrado nos ajuda a saber o que está acontecendo. Uma vez que entendemos claramente como binários compilados dinamicamente (a maioria dos binários no sistema operacional são compilados dessa maneira) carregam e exigem bibliotecas, e como ver se alguma está faltando (ou sendo informado da mesma por meio da mensagem de erro), as coisas não e &’ não parece mais tão complicado.

Publicidade

O que mais é que, assim que soubermos o nome da biblioteca necessária, uma pesquisa rápida em seu mecanismo de pesquisa favorito mostrará o pacote adicional a ser instalado (ou reinstalado) em obtenha o nome da biblioteca necessária. Freqüentemente, o nome do pacote pode até ser interpretado diretamente a partir do nome da biblioteca. No entanto, neste caso, o nome da biblioteca de tempo de execução é um pouco deslocado.

Existem dois tipos de bibliotecas — bibliotecas de tempo de execução e bibliotecas de desenvolvimento. Neste caso, o nome do pacote que contém a biblioteca libbz2. so.1.0 é provavelmente bzip2, e tentar desinstalar provavelmente quebraria vários outros itens, como pode ser visto em uma longa lista de programas que serão removidos se alguém tentar desinstalar ou limpe o pacote bzip2.

O segundo tipo de biblioteca é uma biblioteca de desenvolvimento. Freqüentemente, eles são necessários ao tentar compilar programas e costumam ser ainda mais relacionados aos nomes reais dos arquivos de biblioteca. Por exemplo, no Ubuntu, simplesmente pegue o nome da biblioteca e adicione -dev. Por exemplo, se quisermos instalar o pacote de desenvolvimento relacionado ao pacote libbz2. so.1.0, podemos dar uma olhada na instalação de libbz2-dev:

Considerando que esta biblioteca de desenvolvimento não está diretamente relacionada à nossa biblioteca de tempo de execução libbz2. so.1.0, é útil saber a sintaxe de nomenclatura da maioria dos nomes de pacotes de desenvolvimento no Ubuntu (prefixo de lib e sufixo de - dev com o nome da biblioteca entre eles) para sempre que uma determinada biblioteca de desenvolvimento é necessária (o que é mais frequentemente necessário ao compilar software).

Além disso, suponha que qualquer biblioteca de alguma forma quebrou. Nesse caso, uma das soluções rápidas mais fáceis é limpar o comando sudo apt purge your_library_name da biblioteca (o que limparia completamente a biblioteca / programa passado), seguido por uma reinstalação usando o comando sudo apt install your_library_name.

E quando você se depara com uma situação semelhante à acima, em que a desinstalação da biblioteca de tempo de execução requer a desinstalação / purga do programa principal, e onde essa purga / remoção é uma parte muito grande do sistema operacional ou afetaria muitas outras coisas, você pode usar uma opção de reinstalação em seu lugar:

 sudo apt reinstalar bzip2 

Nem sempre é tão fácil, no entanto, embora saber o que precede (e especialmente a convenção de nomenclatura em termos de adição de -dev) ajude tremendamente na solução de problemas e muitas vezes conserte o problema imediatamente.

Também ajuda muito saber como as bibliotecas podem ser verificadas usando o ldd e, finalmente, entender que uma biblioteca é apenas um arquivo executável (embora não diretamente) . so que reside em um subdiretório de / lib ou em / usr / lib ou outros diretórios semelhantes.

Às vezes, bibliotecas e / ou pacotes entram em conflito uns com os outros, ou certos pacotes requerem certas versões de bibliotecas, ou certas bibliotecas requerem outras bibliotecas, em versões específicas. Sim, fica um pouco complexo. Também é um tanto fácil, quando se torna tão complexo, bagunçar um pouco o sistema. Às vezes, é até mesmo possível interromper completamente a instalação de um sistema operacional devido à movimentação de uma biblioteca muito importante, etc.

Publicidade

Freqüentemente, é um pouco mais seguro criar um link simbólico (um link virtual com um determinado nome de arquivo, referindo / vinculando a outro arquivo existente ou outro link simbólico em si, que por sua vez aponta para um arquivo real) para uma biblioteca ausente em uma versão mais antiga, por exemplo, e apontando esse link simbólico para a versão instalada mais recente. Nem sempre funciona, mas apenas no caso de falhar, o link simbólico pode ser removido, esperançosamente mais seguro (assumindo que nenhum link simbólico ou arquivo com o mesmo nome existisse de antemão).

A melhor maneira de solucionar esses problemas mais complexos é sempre tentar primeiro uma solução baseada em apt (ou uma ferramenta de gerenciamento de pacotes semelhante em seu sistema operacional). Neste ponto, você também vai querer ler como usar dkpg para consertar o apt, pois mostra uma maneira mais granular de gerenciar pacotes (embora tenha cuidado, pois mais controle vem com mais responsabilidade!).

Se tudo mais falhar, tente criar um link simbólico ou até mesmo adicionar manualmente o arquivo de biblioteca. (Certifique-se de que qualquer arquivo baixado esteja livre de vírus, por exemplo, verificando-o com o VirusTotal, e é sempre melhor usar os repositórios fornecidos pelo fornecedor do Linux para baixar os binários.)

In extremis, você também pode encontrar uma biblioteca em um sistema operacional Linux vizinho. Por exemplo, um executável do Ubuntu será executado no Mint e vice-versa. Copiar uma biblioteca de outro PC que você possui também é uma abordagem viável às vezes.

Conclusão

O gerenciamento refinado de bibliotecas é uma habilidade que leva uma vida inteira para ser aprendida. É quase uma arte. Este artigo forneceu as informações básicas / know-how e ferramentas a serem usadas e listou algumas sugestões de solução de problemas mais avançadas para quando as coisas ficarem confusas e, mais cedo ou mais tarde, ficarão se você for um usuário frequente do Linux que instala regularmente pacotes.

Na próxima vez que vir o & # 8216; Erro ao carregar bibliotecas compartilhadas &’ erro em sua máquina Linux, você estará melhor equipado para entender de onde o problema pode surgir usando uma ferramenta como o ldd, conforme explicado neste artigo. Também examinamos binários compilados dinamicamente e estáticos e como bibliotecas compartilhadas ou integradas se encaixam e funcionam com ambos.

Publicidade

Se você gostou deste artigo, você também pode querer ler o artigo sobre dpkg com link acima, bem como Como adicionar o universo, multiverso e repositórios restritos no Ubuntu.

Nenhum comentário