Qual é a diferença entre os arquivos de biblioteca .so, .la e .a?

230

Sei que um .soarquivo é 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 .ae .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 ldcomando agora)

Quando devo tentar criar código .soou .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
hugemeow
fonte
Consulte também autotools.io/libtool/lafiles.html
Pacerier

Respostas:

306

.soarquivos 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.

.aarquivos são bibliotecas estáticas . O sufixo significa "archive", porque na verdade são apenas um archive (feito com o arcomando - um predecessor tarque agora é usado apenas para criar bibliotecas) dos arquivos de objeto .o originais.

.laarquivos 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.

Barmar
fonte
1
@ Barmar, Então você está dizendo que as vantagens das bibliotecas estáticas superam as vantagens das bibliotecas dinâmicas?
Pacerier
4
@ Pacerier Não sei de onde você tirou isso.
Barmar
13
Essa é uma pergunta sem sentido. O peso dos prós e contras depende das circunstâncias, não há resposta universal. Parece que você tem uma agenda e está tentando me atrair.
Barmar
3
@ Barmar, Nop eu sou inocente. Apenas um curioso.
Pacerier
11
Outro fator é o licenciamento - a LGPL requer vinculação dinâmica em um contexto comercial, ou seja, onde você não deseja distribuir sua fonte.
Sam