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.