Eu tenho um executável binário chamado "alpha" que requer uma biblioteca vinculada (libz.so.1.2.7) que é colocada em/home/username/myproduct/lib/libz.so.1.2.7
Eu exporto o mesmo para minha instância de terminal antes de gerar meu executável binário executando o seguinte comando.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Agora, quando eu spawno outro aplicativo "bravo" que requer a mesma biblioteca mas de versão diferente, ou seja (libz.so.1.2.8) que está disponível em
/lib/x86_64-linux-gnu/libz.so.1.2.8
, o sistema lança o seguinte erro.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Se eu desabilitar o LD_LIBRARY_PATH
, "bravo" inicia bem. Eu entendo que o comportamento acima é porque LD_LIBRARY_PATH
tem precedência sobre os caminhos de diretório definidos /etc/ld.so.conf
ao procurar bibliotecas vinculadas e, consequentemente, ocorreu o erro acima. Estou curioso para saber por que os desenvolvedores do UNIX/LINUX não projetaram o sistema operacional para procurar bibliotecas vinculadas em outros diretórios de acordo com a hierarquia se a primeira instância da biblioteca for de versão diferente.
Simplificando, os sistemas UNIX/LINUX percorrem um conjunto de diretórios até encontrar a biblioteca necessária. Mas por que ele não faz o mesmo até encontrar a versão esperada, em vez de aceitar a primeira instância da biblioteca, independentemente de sua versão?
Ele faz, tanto quanto ele está ciente.
zlib.so.1.2.7
ezlib.so.1.2.8
ambos têm um soname dezlib.so.1
, então o seualpha
ebravo
os binários dizem que precisamzlib.so.1
. O carregador dinâmico carrega a primeira biblioteca correspondente que encontrar; ele não sabe que a versão 1.2.8 fornece símbolos adicionaisbravo
necessários. (É por isso que as distribuições se esforçam para especificar informações de dependência adicionais, comozlib1g (>= 1.2.8)
parabravo
.)Você pode pensar que isso deve ser fácil de corrigir, mas não é, principalmente porque binários e bibliotecas listam os símbolos de que precisam separadamente das bibliotecas de que precisam, de modo que o carregador não pode verificar se uma determinada biblioteca fornece todos os símbolos que são necessários a partir dele. Os símbolos podem ser fornecidos de várias maneiras, e a introdução de um link entre os símbolos e as bibliotecas que os fornecem pode quebrar os binários existentes. Há também a diversão adicional da interposição de símbolos para complicar as coisas (e fazer os desenvolvedores sensíveis à segurança arrancarem seus cabelos).
Algumas bibliotecas fornecem informações de versão que acabam sendo armazenadas em
.gnu.version_r
, com um link para a biblioteca fornecedora, o que ajudaria aqui, maslibz
não é uma delas.(Dados os sonames, espero que seu
alpha
binário funcione bem comzlib.so.1.2.8
.)