Sei que um .so
arquivo é um tipo de biblioteca dinâmica (muitos segmentos podem compartilhar essas bibliotecas, portanto, não há necessidade de ter mais de uma cópia dele na memória). Mas qual é a diferença entre .a
e .la
? Todas essas bibliotecas estáticas?
Se as bibliotecas dinâmicas têm grandes vantagens sobre as estáticas, por que ainda existem muitas bibliotecas estáticas?
Também quero conhecer o mecanismo subjacente para carregar bibliotecas (ambos os tipos) e como um pedaço de código em uma lib é chamado quando usado em algum lugar. Qual parte do kernel devo estudar? E que comando / utilitário relacionado do Linux devo saber para saber como um processo está sendo executado? (Eu só conheço o ld
comando agora)
Quando devo tentar criar código .so
ou .a
? Qual é o melhor?
[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror 932 Sep 2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep 2 23:25 openvpn-plugin-down-root.so
Respostas:
.so
arquivos são bibliotecas dinâmicas . O sufixo significa "objeto compartilhado", porque todos os aplicativos vinculados à biblioteca usam o mesmo arquivo, em vez de fazer uma cópia no executável resultante..a
arquivos são bibliotecas estáticas . O sufixo significa "archive", porque na verdade são apenas um archive (feito com oar
comando - um predecessortar
que agora é usado apenas para criar bibliotecas) dos arquivos de objeto .o originais..la
arquivos são arquivos de texto usados pelo pacote "libtools" do GNU para descrever os arquivos que compõem a biblioteca correspondente. Você pode encontrar mais informações sobre eles nesta pergunta: Para que servem o arquivo .la do libtool?As bibliotecas estáticas e dinâmicas têm prós e contras.
Static pro: o usuário sempre usa a versão da biblioteca que você testou com seu aplicativo, portanto, não deve haver problemas de compatibilidade surpreendentes.
Contraste estático: se um problema for corrigido em uma biblioteca, você precisará redistribuir seu aplicativo para tirar proveito dele. No entanto, a menos que seja uma biblioteca que os usuários provavelmente atualizem por conta própria, talvez seja necessário fazer isso de qualquer maneira.
Profissional dinâmico: o espaço ocupado pela memória do processo é menor, porque a memória usada para a biblioteca é amortizada entre todos os processos que utilizam a biblioteca.
Profissional dinâmico: as bibliotecas podem ser carregadas sob demanda em tempo de execução; isso é bom para plug-ins, assim você não precisa escolher os plug-ins a serem usados ao compilar e instalar o software. Novos plugins podem ser adicionados rapidamente.
Contração dinâmica: a biblioteca pode não existir no sistema em que alguém está tentando instalar o aplicativo ou pode ter uma versão incompatível com o aplicativo. Para atenuar isso, o pacote de aplicativos pode precisar incluir uma cópia da biblioteca para poder instalá-lo, se necessário. Isso também é frequentemente mitigado pelos gerenciadores de pacotes, que podem baixar e instalar quaisquer dependências necessárias.
Bibliotecas dinâmicas são especialmente úteis para bibliotecas do sistema, como
libc
. Essas bibliotecas geralmente precisam incluir código que depende do SO e da versão específicos, porque as interfaces do kernel foram alteradas. Se você vincular um programa a uma biblioteca estática do sistema, ele será executado apenas na versão do SO para a qual esta versão da biblioteca foi gravada. Mas se você usar uma biblioteca dinâmica, ela buscará automaticamente a biblioteca que está instalada no sistema em que você executa.fonte