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
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 surgir outro aplicativo "bravo" que requer a mesma biblioteca, mas de versão diferente, isto é, (libz.so.1.2.8) que está disponível no
/lib/x86_64-linux-gnu/libz.so.1.2.8
sistema, 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 desmarcar a opçã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
enquanto procura bibliotecas vinculadas e, consequentemente, ocorreu o erro acima. Estou curioso para saber por que os desenvolvedores do UNIX / LINUX não criaram o sistema operacional para procurar bibliotecas vinculadas em outros diretórios de acordo com a hierarquia, se a primeira instância da biblioteca é 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?
fonte
libz.so.1
é um link simbólico paralibz.so.1.2.8
Respostas:
Faz, tanto quanto está ciente.
zlib.so.1.2.7
ezlib.so.1.2.8
ambos têm um soname dezlib.so.1
, para que seusalpha
ebravo
binários dizem que precisamzlib.so.1
. O carregador dinâmico carrega a primeira biblioteca correspondente que encontra; 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 achar que isso deve ser fácil de corrigir, mas não é, principalmente porque os binários e as bibliotecas listam os símbolos de que precisam separadamente das bibliotecas de que precisam, portanto, 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, desde que eles possam quebrar os binários existentes. Há também a diversão adicional da interposição de símbolos para complicar as coisas (e fazer com que desenvolvedores sensíveis à segurança arrancem os cabelos).
Algumas bibliotecas fornecem informações de versão que acabam sendo armazenadas
.gnu.version_r
, com um link para a biblioteca fornecedora, o que ajudaria aqui, maslibz
não é um deles.(Dados os sonames, eu esperaria que seu
alpha
binário funcionasse bemzlib.so.1.2.8
.)fonte
zlib
não usa delibtool
qualquer maneira, exceto em Darwin, onde éar
;-).