Skip to content
Latchkey

O Que É Linking? A Etapa Que Constrói o Binário Final

Linking é a fase de build que pega arquivos objeto compilados mais bibliotecas e resolve todas as referências entre eles para produzir um programa final executável.

Compilar e linkar são duas etapas distintas. Compilar transforma cada arquivo fonte em código de máquina com placeholders para qualquer coisa que ele referencia em outro lugar. Linking preenche esses placeholders, conectando cada referência à sua definição e montando as peças num executável ou biblioteca completo. É o momento em que unidades de compilação separadas se tornam um único programa.

Onde o linking se encaixa

Um build típico compila cada arquivo fonte independentemente, depois linka os resultados. A compilação pega erros por arquivo; o linking pega os que cruzam arquivos. Só depois de o linking ter sucesso você tem algo que pode de fato rodar.

O que o linking resolve

  • Chamadas de função a definições em outros arquivos ou bibliotecas.
  • Referências a variáveis globais e dados compartilhados.
  • Dependências de biblioteca, estáticas ou dinâmicas.
  • Layout final de memória e ponto de entrada do programa.

Linking estático vs dinâmico

Linking estático assa o código da biblioteca no executável em tempo de build, produzindo um binário maior mas autocontido. Linking dinâmico deixa referências a bibliotecas compartilhadas resolvidas em tempo de carregamento, gerando binários menores que compartilham bibliotecas mas dependem de que estejam presentes.

Por que o linking pode ser lento

Para programas grandes, o linking pode rivalizar ou exceder a compilação em tempo, especialmente com muitos arquivos objeto e bibliotecas grandes. Ele também é intensivo em memória, e é por isso que etapas de link às vezes dominam ou emperram um build em máquinas restritas.

Um exemplo rápido

Rodar gcc a.o b.o -o app é a etapa de linking: ela combina dois arquivos objeto já compilados num executável chamado app, resolvendo as referências entre eles.

Linking em CI

Linking é uma fase de build pesada e faminta por memória, e uma etapa grande de link pode ser lenta ou sofrer OOM kill em runners pequenos. Runners maiores (Latchkey) dão ao linker mais memória e aceleram os builds, e OOM transitórios ou falhas de toolchain durante o linking podem ser repetidos automaticamente.

Principais conclusões

  • Linking resolve referências entre unidades compiladas para produzir um programa executável.
  • É distinto de compilar e pega erros entre arquivos que a compilação não consegue.
  • Linking é pesado em memória e pode ser lento ou sofrer OOM kill em runners pequenos.

Guias relacionados