next up previous contents
Next: Bibliotecas Up: Carregadores e ligadores Previous: Exemplo de aplicação   Sumário

Ligadores

A estratégia de ligação direta apresentada na Seção 4.5 ilustra bem o princípio de resolução de endereços entre módulos, mas ainda apresenta limitações. Uma das limitações é que o programa carregador é mais complexo que o carregador absoluto, ocupando mais espaço em memória. Como o carregador compartilha memória com o programa sendo executado, menos memória é deixada para a aplicação.

Uma estratégia alternativa é isolar os procedimentos de ligação e de carregamento em programas separados. O programa ligador recebe como entrada os diversos módulos a conectar, gerando como saída um único módulo de carga. O programa carregador recebe o módulo de carga como entrada, transfere seu código para a memória e realiza apenas os ajustes de relocação de acordo com o endereço base de memória.

Separando as funções entre dois programas, para o exemplo acima um ligador poderia criar o seguinte módulo de carga:

   0.2E
   1.00.6.10390000002C
   1.06.4.0C00000A
   1.0A.2.6D02
   1.0C.2.5E00
   1.0E.4.06000030
   1.12.6.13C00000001A
   1.18.2.4E75
   1.1A.2.0000
   1.1C.6.30390000002A
   1.22.6.33C00000002C
   1.28.2.4E75
   1.2A.2.0000
   1.2C.2.0000   
   2.02.4
   2.14.4
   2.1E.4
   2.24.4
   3.00

Este resultado foi obtido essencialmente através das seguintes modificações com relação ao algoritmo do carregador com ligação direta:

  1. O registro de início de segmento indica o tamanho total do código de máquina.

  2. O endereço inicial de carga, ipla, é considerado como sendo 0. Assim, todos os endereços passam a ser relativos ao início do módulo de carga.

  3. A saída é enviada a um arquivo (o módulo de carga) ao invés de colocada na memória. A informação de relocação (quais posições de memória deverão ser atualizadas após alocação) deve ser preservada, mas o símbolo de referência não é necessário -- será o início do segmento para todos.

O carregador obtém a informação de quanto espaço deve ser alocado do registro inicial (tipo 0), transfere o código (registros tipo 1) para a área de memória alocada e usa a informação do diretório de relocação (registros tipo 2) para ajustar o endereço nas posições indicadas.

Um ligador que produz módulos de carga relocáveis é usualmente denominado um link-editor, sendo que os mais elaborados permitem definir diversas seções e a inclusão de comandos específicos para a ligação. Um exemplo é o comando ld do Unix. A implementação deste comando (GNU) em Linux incorpora a seguinte informação na sua documentação:

ld combina um número de arquivos objeto e de bibliotecas, reloca seus dados e amarra referências simbólicas. Usualmente o último passo na compilação de um programa é rodar ld.

ld aceita arquivos Linker Command Language escritos em um superconjunto da sintaxe da AT&T's Link Editor Command Language, para fornecer controle total e explícito sobre o processo de ligação.

A linguagem de comandos suportada por ld controla os seguintes aspectos:



Subsections
next up previous contents
Next: Bibliotecas Up: Carregadores e ligadores Previous: Exemplo de aplicação   Sumário
Ivan L. M. Ricarte 2003-02-14