3.2. Ligação estática e dinâmica
Os desenvolvedores têm a opção de usar links estáticos ou dinâmicos ao construir aplicações com linguagens totalmente compiladas. Esta seção lista as diferenças, particularmente no contexto do uso das linguagens C e C++ no Red Hat Enterprise Linux. Para resumir, a Red Hat desestimula o uso de links estáticos em aplicações para o Red Hat Enterprise Linux.
Comparação de ligação estática e dinâmica
A ligação estática torna as bibliotecas parte do arquivo executável resultante. A vinculação dinâmica mantém estas bibliotecas como arquivos separados.
A ligação dinâmica e estática pode ser comparada de várias maneiras:
- Uso de recursos
A ligação estática resulta em arquivos executáveis maiores, que contêm mais código. Este código adicional vindo de bibliotecas não pode ser compartilhado entre vários programas no sistema, aumentando o uso do sistema de arquivos e o uso de memória em tempo de execução. Múltiplos processos rodando o mesmo programa estaticamente vinculado ainda compartilharão o código.
Por outro lado, as aplicações estáticas precisam de menos relocalizações de tempo de execução, levando a uma redução do tempo de inicialização, e requerem menos memória de tamanho de conjunto residente privado (RSS). O código gerado para a ligação estática pode ser mais eficiente do que para a ligação dinâmica devido à sobrecarga introduzida pelo código independente de posição (PIC).
- Segurança
- Bibliotecas dinamicamente vinculadas que proporcionam compatibilidade ABI podem ser atualizadas sem alterar os arquivos executáveis, dependendo destas bibliotecas. Isto é especialmente importante para as bibliotecas fornecidas pela Red Hat como parte do Red Hat Enterprise Linux, onde a Red Hat fornece atualizações de segurança. A ligação estática contra qualquer uma destas bibliotecas é fortemente desencorajada.
- Compatibilidade
A ligação estática parece fornecer arquivos executáveis independentemente das versões das bibliotecas fornecidas pelo sistema operacional. Entretanto, a maioria das bibliotecas depende de outras bibliotecas. Com a ligação estática, esta dependência se torna inflexível e como resultado, tanto a compatibilidade para frente como para trás se perde. A ligação estática é garantida para funcionar somente no sistema onde o arquivo executável foi construído.
AtençãoAs aplicações que ligam estaticamente bibliotecas da biblioteca C GNU (glibc) ainda requerem glibc para estar presentes no sistema como uma biblioteca dinâmica. Além disso, a variante de biblioteca dinâmica de glibc disponível no tempo de execução da aplicação deve ser um pouco idêntica àquela presente durante a ligação da aplicação. Como resultado, a ligação estática é garantida para funcionar somente no sistema onde o arquivo executável foi construído.
- Cobertura de apoio
- A maioria das bibliotecas estáticas fornecidas pela Red Hat estão no canal CodeReady Linux Builder e não são suportadas pela Red Hat.
- Funcionalidade
Algumas bibliotecas, notadamente a Biblioteca C GNU (glibc), oferecem funcionalidade reduzida quando ligadas estaticamente.
Por exemplo, quando estaticamente vinculado, glibc não suporta threads e nenhuma forma de chamadas para a função
dlopen()
no mesmo programa.
Como resultado das desvantagens listadas, a ligação estática deve ser evitada a todo custo, particularmente para aplicações inteiras e para as bibliotecas de glibc e libstdc .
Estojos para ligação estática
A ligação estática pode ser uma escolha razoável em alguns casos, como por exemplo:
- Usando uma biblioteca que não está habilitada para a ligação dinâmica.
-
A ligação totalmente estática pode ser necessária para a execução do código em um ambiente chroot vazio ou em um container. Entretanto, o link estático usando o pacote
glibc-static
não é suportado pela Red Hat.
Recursos adicionais
- Red Hat Enterprise Linux 8: Guia de Compatibilidade de Aplicações
- Descrição do repositório The CodeReady Linux Builder no Package manifest