Como um binário unix decide onde obter uma biblioteca compartilhada?

2

Eu uso um executável Linux, as bibliotecas estão localizadas em muitos lugares. Quero dizer a mesma biblioteca com versão diferente. O problema é que o executável pega o executável na biblioteca errada. O sistema operacional é o Ubuntu de 64 bits.

As bibliotecas estão localizadas em / usr / local / lib e / usr / lib / x86_64-linux-gnu. Eu gostaria que usasse a versão / usr / local / lib.

Para forçá-lo a usar a versão / usr / local / lib. Eu copiei o .so de lá para / usr / lib / x86_64-linux-gnu e deletei. Então referenciei lá. O resultado foi que o software (VLC) não usou as bibliotecas recém-copiadas, mas parou de funcionar corretamente e não encontrou a biblioteca. Apesar do fato, estava ali. Portanto, não está claro como o VLC decide qual biblioteca usar.

É claro que ele usa os arquivos em /etc/ld.so.conf.d para obter os caminhos da biblioteca. (Os arquivos contêm / usr / local / lib e / usr / lib / x86_64-linux-gnu) Por que não escolhe a biblioteca que eu copiei em / usr / lib / x86_64-linux-gnu ou em / usr / local / lib?

LD_LIBRARY_PATH não está definido.

Atualização:

Eu pensei em adicionar outra versão, o programa usaria isso, mas parece que a versão da biblioteca está configurada em tempo de compilação para o executável fornecido. por isso não vai usar a nova versão, só porque eu apago uma antiga.

    
por Aftershock 20.03.2013 / 09:38

1 resposta

0

Duas maneiras pelas quais isso pode ser alcançado

a) Definindo rpath no linktime - esta é uma maneira muito feia e não suportável e deve ser evitada sempre que possível

b) Usando a variável de ambiente LD_LIBRARY_PATH (não se esqueça de exportar isso se você alterá-la!)

Se você quiser usar uma versão específica / modificada / foo-reason para seu binário, sugiro

a) link contra ele estaticamente se a licença permitir que

b) use LD_PRELOAD como explicado aqui link

c) modifique o LD_LIBRARY_PATH (verifique se o seu caminho é o primeiro nessa lista, eles são pesquisados em ordem) usando um script de execução que faz isso

    
por 20.03.2013 / 14:15