Red Hat Training

A Red Hat training course is available for RHEL 8

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ção

As 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