4.2. O mecanismo soname
Bibliotecas carregadas dinamicamente (objetos compartilhados) usam um mecanismo chamado soname para gerenciar múltiplas versões compatíveis de uma biblioteca.
Pré-requisitos
- Você deve compreender a ligação dinâmica e as bibliotecas.
- Você deve compreender o conceito de compatibilidade ABI.
- Você deve compreender as convenções de nomenclatura das bibliotecas.
- Você deve compreender os vínculos simbólicos.
Introdução do problema
Uma biblioteca carregada dinamicamente (objeto compartilhado) existe como um arquivo executável independente. Isto torna possível atualizar a biblioteca sem atualizar as aplicações que dependem dela. Entretanto, surgem os seguintes problemas com este conceito:
- Identificação da versão atual da biblioteca
- Necessidade de múltiplas versões da mesma biblioteca presentes
- Sinalizando a compatibilidade ABI de cada uma das múltiplas versões
O mecanismo soname
Para resolver isto, o Linux usa um mecanismo chamado soname.
Uma versão da biblioteca foo
X.Y é compatível com outras versões da ABI com o mesmo valor de X em um número de versão. Pequenas mudanças preservando a compatibilidade aumentam o número Y. Grandes mudanças que quebram a compatibilidade aumentam o número X.
A versão atual da biblioteca foo
X.Y existe como um arquivo libfoo.so.x.y
. Dentro do arquivo da biblioteca, um soname é gravado com o valor libfoo.so.x
para sinalizar a compatibilidade.
Quando as aplicações são construídas, o linker procura a biblioteca, procurando o arquivo libfoo.so
. Um link simbólico com este nome deve existir, apontando para o arquivo real da biblioteca. O linker então lê o soname do arquivo da biblioteca e o grava no arquivo executável da aplicação. Finalmente, o linker cria o aplicativo que declara a dependência da biblioteca usando o soname, não um nome ou um nome de arquivo.
Quando o linker dinâmico de tempo de execução liga um aplicativo antes de ser executado, ele lê o soname do arquivo executável do aplicativo. Este soname é libfoo.so.x
. Um vínculo simbólico com este nome deve existir, apontando para o arquivo real da biblioteca. Isto permite carregar a biblioteca, independentemente do componente Y de uma versão, porque o soname não muda.
O componente Y do número de versão não está limitado a um único número. Além disso, algumas bibliotecas codificam sua versão em seu nome.
Leitura do soname de um arquivo
Para exibir o soname de um arquivo da biblioteca somelibrary
:
$ objdump -p somelibrary | grep SONAME
Substitua somelibrary pelo nome real do arquivo da biblioteca que você deseja examinar.