Quando a ligação com a versão indefinida de uma biblioteca é uma escolha correta?

1

Com strace , vejo que um programa precisa de uma versão não especificada da biblioteca gmp :

open("/lib/x86_64-linux-gnu/libgmp.so", O_RDONLY|O_CLOEXEC) = \
   -1 ENOENT (No such file or directory)

Acho que deveria estar vinculado a uma versão de interface específica (por exemplo, libgmp.so.10 , por exemplo).

Isso não parece prática comum embora. É por acaso ou existe uma razão válida para confiar em uma versão não especificada?

O único caso aceitável em que consigo pensar é na distribuição do sistema operacional: você constrói (e controla) cada pacote.

    
por sevo 25.12.2016 / 00:22

1 resposta

4

Eu não diria "inaceitável", mas é definitivamente incomum para um binário procurar uma biblioteca compartilhada sob o nome *.so simples em tempo de execução. Geralmente:

  • O vinculador (tempo de criação) procura bibliotecas com nomes correspondentes a *.so
  • Se encontrado, o vinculador consultará o campo SONAME da biblioteca para descobrir o nome que a biblioteca deve estar localizada como no tempo de execução
  • Ele registra esse nome dentro do binário construído para que ele se torne o que procura no tempo de execução.

O propósito desta convenção é para que o binário possa ser vinculado a uma versão específica da API da biblioteca.

Talvez a biblioteca em questão não esteja usando essa convenção. Para verificar, veja se a biblioteca contém um campo SONAME:

objdump -p /lib/'arch'-linux-gnu/libthing.so | fgrep SONAME

Se não existir SONAME, os binários vinculados a essa biblioteca usarão como padrão o nome sob o qual a biblioteca foi localizada no momento da criação (que é *.so ). Isso pode ser o que você está vendo. Se um SONAME existir, os binários vinculados a essa biblioteca devem estar usando esse nome em tempo de execução.

    
por 25.12.2016 / 00:52