Estou ciente de que objetos compartilhados no Linux usam "so numbers", ou seja, que versões diferentes de um objeto compartilhado recebem extensões diferentes, por exemplo:
example.so.1
example.so.2
Entendo que a idéia é ter dois arquivos distintos, de modo que duas versões de uma biblioteca possam existir em um sistema (em oposição a "DLL Hell" no Windows). Gostaria de saber como isso funciona na prática? Muitas vezes, vejo que example.so
é de fato um link simbólico para example.so.2
onde .2
está a versão mais recente. Como, então, um aplicativo, dependendo de uma versão mais antiga, example.so
identifica-o corretamente? Existem regras sobre quais números se deve usar? Ou isso é simplesmente uma convenção? É o caso de que, diferentemente do Windows, onde os binários de software são transferidos entre sistemas, se um sistema tiver uma versão mais recente de um objeto compartilhado, ele é vinculado à versão mais antiga automaticamente ao compilar a partir da origem?
Eu suspeito que isso esteja relacionado, ldconfig
mas não sei como.
fonte
ldd
requer o caminho completo para o executável.=ls
faz isso em zsh, mas eu mudei uma vez que nem todo mundo usa essa cascaOs números nas bibliotecas compartilhadas são convenção usada no Linux para identificar a API de uma biblioteca. Normalmente, o formato é:
E, como você notou, geralmente há um link simbólico de libFOO.so para libFOO.so.MAJOR.MINOR. O ldconfig é responsável por atualizar este link para a versão mais recente.
O MAJOR normalmente é incrementado quando a API é alterada (novos pontos de entrada são removidos ou os parâmetros ou tipos alterados). Normalmente, o MINOR é incrementado para lançamentos de correções de bugs ou quando novas APIs são introduzidas sem quebrar as APIs existentes.
Uma discussão mais extensa pode ser encontrada aqui: Dissecando bibliotecas compartilhadas
fonte
libFOO.so.MAJOR.MINOR
(assim não no final)As bibliotecas compartilhadas devem ter versão de acordo com o seguinte esquema:
Onde
Normalmente, você vê apenas o primeiro dígito como
hello.so.1
porque o primeiro dígito é a única coisa necessária para identificar a "versão" da biblioteca, pois todos os outros dígitos são compatíveis com versões anteriores.ldconfig
mantém uma tabela de quais bibliotecas compartilhadas estão disponíveis em um sistema e onde existe o caminho para essa biblioteca. Você pode verificar isso executando:Quando um pacote é criado para algo como o Red Hat, as bibliotecas compartilhadas chamadas no binário serão pesquisadas e adicionadas como dependências do pacote no tempo de criação do RPM. Portanto, quando você instala o pacote, o instalador verifica se está ou não
hello.so.1
instalado no sistema, verificandoldconfig
.Você pode ver as dependências de um pacote fazendo algo como:
Esse sistema (ao contrário do Windows) permite que várias versões
hello.so
sejam instaladas em um sistema e sejam usadas por diferentes aplicativos ao mesmo tempo.fonte
libNAME.so é o nome do arquivo usado pelo compilador / vinculador ao procurar pela primeira vez uma biblioteca especificada por -lNAME. Dentro de um arquivo de biblioteca compartilhada, há um campo chamado SONAME. Este campo é definido quando a própria biblioteca é primeiro vinculada a um objeto compartilhado pelo processo de construção. Na verdade, esse SONAME é o que um vinculador armazena em um executável, dependendo do objeto compartilhado que está vinculado a ele. Normalmente, o SONAME está na forma de libNAME.so.MAJOR e é alterado a qualquer momento que a biblioteca se torna incompatível com os executáveis existentes vinculados a ele e as duas versões principais da biblioteca podem ser mantidas instaladas conforme necessário (embora apenas um seja apontado para desenvolvimento como libNAME.so) Além disso, para oferecer suporte à atualização fácil entre versões secundárias de uma biblioteca, libNAME.so.MAJOR normalmente é um link para um arquivo como libNAME.so.MAJOR.MINOR. Uma nova versão secundária pode ser instalada e, uma vez concluída, o link para a versão secundária antiga é aumentado para apontar para a nova versão secundária, atualizando imediatamente todas as novas execuções para usar a biblioteca atualizada. Além disso, veja minha resposta paraScripts para Linux, GNU GCC, ld, version e o formato binário ELF - Como funciona?
fonte