Pergunta

Eu sempre fui confundido sobre como funciona o vinculador, e é um assunto difícil de procurar.

Para demonstrar a minha pergunta e fornecer uma estrutura para uma resposta, eu vou colocar para baixo o que eu sei (ou acho que sei) até agora. Posso estar muito errado. :)

Em primeiro lugar, cada arquivo .cpp é construído em um arquivo intermediário (.o para Posix / ELF e obj para Win / PE eu acredito). Este arquivo intermediário contém todos os símbolos definidos pelo CPP foi construído a partir e tem instruções para que ligações externa que precisa ser devidamente resolvido. Como uma extensão para isso, sistemas Posix permitem combinar os arquivos .o em um arquivo .a (o que não parece fazer nada mais do que combinam? Qual comando faz isso?). É lib o equivalente Win / PE do Posix .a arquivo?

Em seguida, os arquivos intermediários estão ligados entre si, dependências externas resolvido, e você tem o seu executável. Estou faltando quaisquer medidas?

Obrigado!

Foi útil?

Solução

Eis algumas peças do quebra-cabeça:

  • ar (1) é usado para criar arquivos .a. Eles são semelhantes ao alcatrão (1) ou arquivos zip (possivelmente com um índice para procurar um arquivo objeto pelo nome do símbolo)
  • Os vinculador cópias juntos as seções de arquivos de objetos (texto, dados, BSS). Para GNU ld, a cópia exata de seções podem ser controlados com um script de vinculador (por exemplo, copiar todas as seções de .o arquivos contendo "texto" em seus nomes em uma seção de texto simples)
  • O vinculador também faz deslocalizações: instruções de aplicação de patches (salto e carga de dados) com os respectivos endereços de destino, uma vez que o valor de um símbolo é conhecido. Em alguns casos, isso não pode ser feito em tempo de ligação, de modo que os vinculador cópias / ajusta os registros de realocação dos arquivos .o no executável final.
  • as janelas lib serve a dois propósitos: uma biblioteca estática (lib) é semelhante ao .a bibliotecas. Uma biblioteca de importação (.lib) não contém o código real, mas apenas listas de símbolos. O vinculador pode resolver símbolos da biblioteca de importação, mas, em seguida, sabe que precisa colocar uma referência à .dll correspondente no executável. No Unix / ELF, o arquivo .so tem tanto o código e tabela de símbolos.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top