Está tudo bem (ou não) vincular bibliotecas de links simbólicos para superar erros de "não é possível abrir objeto compartilhado"?

12

Às vezes, por um motivo ou outro, um programa não especificou ou incluiu todas as suas dependências corretamente, e a inicialização resulta em erros indicando dependências ausentes. Um erro típico é algo como:

cannot open shared object libudev.so.0

Vejo muitas respostas aconselhando as pessoas a contornar esses problemas criando links simbólicos em /usr/libou em outros locais do sistema, e isso parece resolver o problema com frequência. Mas vejo um número igual de comentários aconselhando as pessoas que é uma má ideia. Aqui está uma resposta que é representativa.

Em que circunstâncias é aceitável vincular uma biblioteca a um programa para que ele funcione? Nunca? As vezes? E se você excluir o link simbólico após concluir a execução do programa?

Quais são as consequências de fazer isso?

John Feminella
fonte

Respostas:

12

O problema com a criação desses links é que eles não são gerenciados de maneira significativa. Se essa biblioteca for removida, o link será quebrado. Se a biblioteca for atualizada, ele poderá encontrar um erro devido ao link que não espera estar lá.

Além disso, você está essencialmente mentindo para o sistema. No exemplo vinculado, você está fingindo que libudev.so.1é realmente libudev.so.0. Eles são nomeados de maneira diferente por um motivo (versões diferentes da biblioteca). Embora isso possa funcionar bem para alguns programas, existe o potencial de que diferenças entre as versões possam causar problemas (como um segfault ou outro comportamento inesperado).

Portanto, se você estiver criando especificamente esse link apenas para que um programa seja executado e saiba que o removerá posteriormente, você solucionará o primeiro problema, mas não o segundo. Embora isso resolva a questão principal, não é o ideal.

A solução ideal é, obviamente, instalar a versão correta da biblioteca (a resposta aceita no seu exemplo vinculado) ou compilar o programa com a versão que você possui.

Nattgew
fonte