Tipos de ligação dinâmica em ambientes Unix / Linux

2

Ao criar uma biblioteca estática do windows, simplesmente criamos um arquivo .lib que deve ser incluído no caminho do vinculador.

Ao criar uma biblioteca compartilhada do Windows, juntamente com o arquivo .dll, também geramos um arquivo .lib. Este arquivo lib contém as assinaturas da API exposta pela biblioteca.

Existem duas maneiras de usar essa biblioteca

  1. Podemos referir diretamente a API da biblioteca em nosso projeto e adicionar o caminho ao arquivo .lib nas propriedades do vinculador. Algumas pessoas chamam de biblioteca dinâmica estaticamente vinculada
  2. Ou podemos carregar explicitamente a biblioteca dinâmica durante o tempo de execução. Neste caso, não precisamos especificar o caminho do arquivo lib para o linker. Chame-a de biblioteca dinâmica vinculada dinamicamente.

A minha pergunta é se temos algo semelhante para bibliotecas compartilhadas no Linux também? ou apenas a biblioteca estática (.a) e biblioteca compartilhada (.so)?

Eu sei como incluir uma biblioteca estática no linux usando a opção gcc -l. Podemos usar a mesma opção para incluir uma biblioteca dinâmica (.so) também?

    
por Ravi Chandra 19.11.2014 / 12:20

1 resposta

3

Eu não posso dizer que entendo o que é uma "biblioteca dinâmica vinculada estaticamente", nem sei nada sobre assinaturas contidas em bibliotecas (parece interessante: isso significa que o vinculador é capaz de verificar incompatibilidades de tipos em argumentos e retornar tipos no momento do link? ELF definitivamente não tem tal recurso.) por isso esta resposta não será de um ponto de vista comparativo. Além disso, como sua pergunta é muito ampla, a resposta será superficial em detalhes.

Sim, você pode criar uma biblioteca estática ( .a ) ou uma biblioteca compartilhada ( .so ). Quando o vinculador procurar por bibliotecas solicitadas com -l , ele preferirá a biblioteca compartilhada, se ambas existirem, a menos que seja substituído por uma opção como -static .

Ao criar uma biblioteca a partir do código-fonte, é necessário apenas construí-la como uma biblioteca estática ( .a ) ou como uma biblioteca compartilhada ( .so ), não ambos. Ainda assim, scripts de compilação de alguns pacotes são configurados para construir ambas as versões (o que requer compilar duas vezes, uma com código independente de posição e uma vez sem) para dar aos consumidores da biblioteca a escolha de qual link. p>

As partes necessárias de uma biblioteca estática são totalmente incorporadas ao binário que é construído. Não é necessário ter o arquivo .a disponível no tempo de execução. Em contraste, uma biblioteca compartilhada que estava vinculada a um binário deve estar disponível em tempo de execução, embora o vinculador dinâmico de tempo de execução pesquise normalmente sob um nome modificado, seu "soname" (geralmente libsomething.so no tempo de link e libsomething.so.<integer> no tempo de execução), que é um recurso que permite que várias versões diferentes de uma biblioteca com APIs ligeiramente diferentes sejam instaladas no sistema ao mesmo tempo.

Em sua pergunta, você menciona também o carregamento explícito de bibliotecas dinâmicas em tempo de execução. Isso geralmente é feito para aplicativos modulares ou aplicativos com plug-ins. Nesse caso, a biblioteca em questão (geralmente chamada de "módulo" ou "plug-in") não está vinculada ao aplicativo e o vinculador de tempo de construção não sabe nada disso. Em vez disso, o desenvolvedor do aplicativo deve escrever código para chamar o vinculador dinâmico em tempo de execução e solicitar que ele abra uma biblioteca por nome de arquivo ou nome de caminho completo. Às vezes, os nomes dos módulos a serem abertos são listados no arquivo de configuração do aplicativo ou há outra lógica de aplicativo que decide quais módulos são ou não necessários.

    
por 19.11.2014 / 13:10