Na verdade, você pode instalar várias versões de uma biblioteca compartilhada, se isso for feito corretamente.
As bibliotecas compartilhadas geralmente são nomeadas da seguinte forma:
lib<name>.so.<api-version>.<minor>
Em seguida, há links simbólicos para a biblioteca com os seguintes nomes:
lib<name>.so
lib<name>.so.<api-version>
Quando um desenvolvedor vincula-se à biblioteca para produzir um binário, é o nome do arquivo que termina em .so
que o vinculador encontra. Na verdade, pode haver apenas um desses instalados por vez para qualquer <name>
, mas isso significa que um desenvolvedor não pode segmentar várias versões diferentes de uma biblioteca ao mesmo tempo. Com os gerenciadores de pacotes, este symlink .so
é parte de um pacote -dev
separado, que somente os desenvolvedores precisam instalar.
Quando o vinculador encontra um arquivo com um nome que termina em .so
e o usa, ele procura dentro dessa biblioteca por um campo chamado soname . O soname informa ao vinculador que nome de arquivo deve ser inserido no binário resultante e, portanto, qual nome de arquivo será procurado no tempo de execução. O soname deve estar configurado para lib<name>.so.<api-version>
.
lib<name>.so.<api-version>
e usará isso.
A intenção é que:
-
As atualizações de
<minor>
não alteram a API da biblioteca e quando o<minor>
é direcionado para uma versão superior, é seguro permitir que todos os binários atualizem para a nova versão. Como todos os binários estão procurando a biblioteca sob olib<name>.so.<api-version>
name, que é um link simbólico para o mais recentelib<name>.so.<api-version>.<minor>
instalado, eles recebem o upgrade. -
Os upgrades de
<api-version>
alteram a API da biblioteca e não é seguro permitir que os aplicativos binários existentes usem a nova versão. No caso em que o<api-version>
é alterado, como esses aplicativos estão procurando o nomelib<name>.so.<api-version>
, mas com um valor diferente para<api-version>
, eles não selecionam a nova versão.
Os gerenciadores de pacotes não costumam empacotar mais de uma versão da mesma biblioteca na mesma versão de distribuição porque toda a distribuição, incluindo todos os binários que fazem uso da biblioteca, é geralmente compilada para usar uma versão consistente de cada biblioteca antes a distribuição é liberada. Certificar-se de que tudo é consistente e de que tudo em uma distribuição é compatível com tudo o mais é uma grande parte da carga de trabalho dos distribuidores.
Mas você pode facilmente acabar com várias versões de uma biblioteca se você tiver atualizado seu sistema de uma versão de sua distração para outra e ainda tiver alguns pacotes mais antigos que requerem versões de bibliotecas mais antigas. Exemplo:
-
libmysqlclient16 de um Debian antigo, contém
libmysqlclient.so.16.0.0
e symlinklibmysqlclient.so.16
. -
libmysqlclient18 do Debian atual, contém
libmysqlclient.so.18.0.0
e symlinklibmysqlclient.so.18
.