SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Downloaden Sie, um offline zu lesen
Produção do código executável

          Ivan Ricarte


             2008




                                I NTRODUÇÃO À COMPILAÇÃO
Sumário


  Interação do compilador com outros aplicativos


  Montadores
    Estrutura de programas em linguagem simbólica
    O processo de montagem
    Um montador em dois passos


  Carregadores e ligadores
     Ligadores
     Bibliotecas
     Carregamento e ligação dinâmicos



                                                    I NTRODUÇÃO À COMPILAÇÃO
Interação do compilador com outros aplicativos



      Compilador atua como front-end para demais aplicativos
      Com as opções apropriadas, é possível interromper o
      processo de compilação antes de uma dessas etapas
      Nos compiladores gcc:
             -S Não faça a montagem, produto é um arquivo
                 de texto com o código em linguagem
                 simbólica
              -c Não faça a ligação, produto é um arquivo
                 binário com o código-objeto




                                                    I NTRODUÇÃO À COMPILAÇÃO
Montadores


     Instruções em linguagem simbólica refletem a arquitetura
     de cada processador
         Quais operações podem ser realizadas
         Que registradores estão disponíveis
         Quais modos de endereçamento são suportados
     O programa montador reconhece essas instruções
         E sabe como realizar a tradução do formato simbólico
         (texto) para o formato de máquina (binário)
     Quando montador que executa num processador permite
     a geração de código de máquina para um outro
     processador, ele é denominado montador multiplataforma
     (cross-assembler)



                                                       I NTRODUÇÃO À COMPILAÇÃO
Montadores


     Traduzem código em linguagem simbólica para linguagem
     de máquina
         Específicos para cada processador
     Facilidades presentes em montadores:
     Pseudo-instruções Diretivas que não geram código de
                  máquina
                     Facilidades para simplificar codificação em
                     linguagem simbólica
        Rótulos Identificação simbólica de endereços
     Macroinstruções Seqüências de instruções associadas a
                 um nome



                                                     I NTRODUÇÃO À COMPILAÇÃO
Estrutura de programas em linguagem simbólica



      Programas em linguagem simbólica têm estrutura rígida
        Campo 1 Rótulo (opcional)
                      Associado a identificadores
        Campo 2 Código de operação
                      Código da instrução do processador ou da
                      pseudo-instrução do montador
        Campo 3 Operandos
      Comentários também podem estar presentes




                                                     I NTRODUÇÃO À COMPILAÇÃO
Exemplo de código em linguagem simbólica



            .file    "hello.cpp"
            .text
            .align 2
  .LCFI2:
            movl    %eax, -4(%ebp)
            movl    %edx, -8(%ebp)
            cmpl    $1, -4(%ebp)
            jne     .L5




                                       I NTRODUÇÃO À COMPILAÇÃO
Exemplo de código em linguagem simbólica


   POS      DS.W      1
   ; Busca 0 na sequencia de inteiros
   ; DATUM definido alhures
   SRCH0    MOVEA.L   #DATUM,A0
            MOVE.L    #DATUM,D0   ; guarda inicio
            CLR.W     D1
   LOOP     CMP.W     (A0)+,D1
            BNE       LOOP
            SUB.L     A0,D0
            MOVE.W    D0,POS
            RTS
            END


                                        I NTRODUÇÃO À COMPILAÇÃO
Facilidades presentes em montadores
Representação de constantes (exemplos)




    Inteiro decimal 48
    Inteiro hexadecimal $30
    Inteiro octal @60
    Inteiro binário %110000
    Caractere simples ou seqüência ’0’, ’ABC’




                                                I NTRODUÇÃO À COMPILAÇÃO
Facilidades presentes em montadores
Pseudo-instruções (exemplos)




    EQU
    Associação de valores a nomes simbólicos

    DC
    Alocação de espaço para variáveis com valores inicializados

    DS
    Reserva de espaço para variáveis sem valores inicializados




                                                       I NTRODUÇÃO À COMPILAÇÃO
Facilidades presentes em montadores
Pseudo-instruções (exemplos)




    ORG
    Definição de segmento (origem)

    END
    Sinalização do fim do programa em linguagem simbólica

    GLOB
    Indicação de símbolo que pode ser referenciado por outros
    módulos




                                                      I NTRODUÇÃO À COMPILAÇÃO
Exemplos de uso de pseudo-instruções
EQU




      Definição
       SIZE      EQU    100

      ...
      Uso
                 MOVE   #SIZE,D0




                                       I NTRODUÇÃO À COMPILAÇÃO
Exemplos de uso de pseudo-instruções
DC, DS




     CONTADOR   DC.L   100
     ARR1       DC.W   0,1,1,2,3,5,8,13
     MENSAGEM   DC.B   ’Alo, pessoal!’
     VALUE      DS.W    1




                                          I NTRODUÇÃO À COMPILAÇÃO
Exemplos de uso de pseudo-instruções
ORG, END




    SEG1    EQU      $1000
            ...
            ORG      SEG1
            MOVE.W   DATA,D0
            MOVE.W   D0,DATA+2
            RTS
            ...
            END




                                       I NTRODUÇÃO À COMPILAÇÃO
Macroinstrução


      Seqüência de instruções que recebe um nome
      Futuras referências a esse nome serão substituídas pela
      seqüência de instruções
      Podem ter argumentos
  Definição de macro Em geral, delimitada por
             pseudo-instruções de início e fim de definição de
             macro
  Facilidades na definição da macro Comandos dentro do corpo
               da macro, para expansão condicional
  Invocação da macro Substituição do nome referenciado pela
              sua expansão (instruções e argumentos)


                                                    I NTRODUÇÃO À COMPILAÇÃO
Macro em montadores
Exemplo de definição



     TOLOWER      MACRO       &IN,&OUT
                  MOVE        &IN,D0
                  ORI         32,D0
                  MOVE        D0,&OUT
                  ENDM

         Argumento IN é um caráter ASCII
         Se caráter é uma letra maiúscula, resultado é a letra
         minúscula correspondente
              OR imediato com valor 32 — sexto bit é setado
              D0 é um registrador de dados do processador
         Resultado é colocado no argumento OUT

                                                              I NTRODUÇÃO À COMPILAÇÃO
Processamento de macros


     Se todo uso de macro é precedido da correspondente
     definição, processamento da macro ocorre em um único
     passo
      1. Quando pseudo-instrução MACRO é encontrada, as
         instruções seguintes (até a pseudo-instrução ENDM, de fim
         de macro) são armazenadas em uma Tabela de Definição
         de Macro
             Associada a essa tabela é armazenada também a lista de
             parâmetros da macro
      2. Quando uma operação utilizada no código é encontrada na
         Tabela de Definição de Macro, essa referência é
         substituída pelo conjunto de instruções lá armazenada
             Parâmetros referenciados na tabela são substituídos pelos
             argumentos usados na referência à macro



                                                           I NTRODUÇÃO À COMPILAÇÃO
O processo de montagem
  Características gerais:
      Pré-processamento para eliminação de comentários e
      substituição de macros
      Varreduras por linha, com extração e processamento dos
      campos

  Estruturas auxiliares
  Tabela de instruções de máquina informação necessária para
               traduzir instruções simbólicas do processador
               para o correspondente código de máquina
                    Depende do processador
  Tabela de pseudo-instruções Informação necessária para
              processar pseudo-instruções do montador
                  Não depende do processador, mas sim do
                  montador
                                                   I NTRODUÇÃO À COMPILAÇÃO
Um montador em dois passos



     Passo 1 Processamento dos símbolos definidos no código
                 Qual o valor associado a cada símbolo?
                 Resultado armazenado numa tabela de
                 símbolos
     Passo 2 Geração do código de máquina
                 Utiliza tabela criada no Passo 1 para codificar
                 operandos das instruções de máquina
                 Resultado armazenado em arquivo binário
                 (módulo objeto)




                                                    I NTRODUÇÃO À COMPILAÇÃO
Passo 1 do montador
  Objetivo do primeiro passo é identificar a posição associada a
  cada identificador utilizado no código
      Uma instrução por linha, processada independentemente
      Identificadores no código assembly: sempre no campo de
      rótulo
      Processamento do rótulo: cria entrada na Tabela de
      Símbolos
          Para cada identificador, o valor do endereço associado a
          ele
          Informação obtida na MOT: quanto espaço é ocupado pela
          instrução
          Informação obtida na POT: qual impacto da
          pseudo-instrução no valor do endereço
               Altera valor do endereço? (ORG)
               Precisa reservar espaço no módulo objeto? (DS, DC)
          Se pseudo-instrução é EQU, entrada na Tabela de Símbolos
          é criada com o valor do argumento e não do endereço
                                                            I NTRODUÇÃO À COMPILAÇÃO
Montador
Passo 2: criação do módulo objeto


         No segundo passo, cada linha do código é novamente
         processada
         Como todas as referências simbólicas foram resolvidas no
         passo anterior, código de máquina para cada instrução
         pode ser gerado
               Para cada instrução do processador, código de operação é
               obtido da MOT
               Operandos das instruções:
                 Constante valor para operando obtido do próprio código
                             da instrução (modo imediato)
                  Simbólico valor para operando obtido da Tabela de
                             Símbolos criada no primeiro passo
         Código binário gerado para cada instrução é agregado a
         um arquivo com o módulo objeto

                                                            I NTRODUÇÃO À COMPILAÇÃO
Exemplo: código-fonte



   DATA      EQU        $6000
   PROGRAM   EQU        $4000
             ORG        DATA
   VALUE     DS.W       1
   RESULT    DS.W       1
             ORG        PROGRAM
   PGM       MOVE.W     VALUE,D0
             MOVE.W     D0,RESULT
             RTS
             END        PGM




                                    I NTRODUÇÃO À COMPILAÇÃO
Exemplo: Tabela de símbolos




             Símbolo          Valor
             DATA             $6000
             PGM              $4000
             PROGRAM          $4000
             RESULT           $6002
             VALUE            $6000




                                      I NTRODUÇÃO À COMPILAÇÃO
Exemplo: Código gerado



  Segmento de dados
    Posição   $6000   $6002
   Conteúdo   $0000   $0000


  Segmento de texto (código)
    Posição   $4000   $4002   $4004   $4006   $4008     $400A        $400C
   Conteúdo   $3038   $0000   $6000   $31C0   $0000     $6002        $4E75




                                                      I NTRODUÇÃO À COMPILAÇÃO
Carregadores e ligadores


  Módulo objeto criado pelo montador ainda não é executável
     Pode ter referências a símbolos em outros módulos
           Variáveis externas
           Rotinas
       Precisa ser carregado em memória para execução
           Pode necessitar ajustes nas referências à memória
  Programas que executam essas tarefas
      Ligador Resolve referências entre símbolos de diferentes
              módulos
   Carregador transfere código objeto para a memória e dá início
              à sua execução



                                                        I NTRODUÇÃO À COMPILAÇÃO
Formato do módulo objeto
Informação usualmente presente

    Cabeçalho: contém a identificação do tipo de arquivo e dados
               sobre o tamanho do código e eventualmente o
               arquivo que deu origem ao arquivo objeto.
    Código gerado: contém as instruções e dados em formato
               binário, apropriado ao carregamento.
     Relocação: contém as posições no código onde deverá
                ocorrer mudanças de conteúdo quando for
                definida a posição de carregamento.
      Símbolos: contém os símbolos globais definidos no módulo e
                símbolos cujas definições virão de outros
                módulos.
    Depuração: contém referências para o código-fonte, tais como
               número de linha, nomes originais dos símbolos
               locais e estruturas de dados definidas.
                                                      I NTRODUÇÃO À COMPILAÇÃO
Estratégias de carregamento e ligação
Esquemas absolutos


         Nesses esquemas, o programador é responsável pela
         realização dos ajustes
         Código já contém referências às posições efetivas de
         memória de variáveis e rotinas
         Esquemas adequados para sistemas de pequeno porte e
         monoprogramados

    Exemplos:
    Montador combinado com carregador Código gerado já é
               colocado na memória e não no disco
    Carregador absoluto Módulo objeto contém referências
                efetivas à memória e precisa ser carregado em
                uma posição específica

                                                        I NTRODUÇÃO À COMPILAÇÃO
Montagem e carregamento combinados
Desvantagens




        Responsabilidade do programador de manter endereços
        Programa montador ocupa memória que poderia ser
        usada na execução do programa de aplicação
        Cada execução demanda nova montagem, mesmo que
        nenhuma alteração tenha ocorrido




                                                   I NTRODUÇÃO À COMPILAÇÃO
Carregamento absoluto




     Também esquema absoluto
     Separa montagem do carregamento
         Montador cria módulo objeto em disco
     Carregador transfere módulo objeto do disco para a
     memória principal
         Outro programa do sistema
         Módulo objeto deve conter informação para sua operação




                                                     I NTRODUÇÃO À COMPILAÇÃO
Carregamento absoluto
Conteúdo do módulo objeto




    Módulo objeto deve conter informação sobre endereço de
    memória principal no qual deve ser carregado
         Um registro para cada segmento contíguo de código
         Um outro tipo de registro contém o endereço de início de
         execução
              Controle da execução é transferido para esse endereço ao
              final do carregamento




                                                           I NTRODUÇÃO À COMPILAÇÃO
Carregamento absoluto
Limitações




         Programador é responsável por manter o registro dos
         endereços
             Localização na memória de variáveis e subrotinas
         Não há flexibilidade para execução do código
             Se posição de memória não estiver disponível, programa
             não pode ser executado




                                                           I NTRODUÇÃO À COMPILAÇÃO
Estratégias de carregamento e ligação
Esquemas relocáveis




         Nesses esquemas, o módulo objeto gerado não tem
         referências às posições efetivas de memória de variáveis e
         rotinas, mas relativas a algum endereço-base
         Quando módulo é carregado, as referências relativas
         precisam ser resolvidas
         Módulo objeto precisa manter informação para realização
         desses ajustes

    Dois tipos de ajustes
     relocação: ajuste interno a um módulo
        ligação: ajuste entre módulos distintos


                                                        I NTRODUÇÃO À COMPILAÇÃO
Esquemas relocáveis
Informação presente no módulo objeto




    Dicionário de Símbolos Externos (ESD): contém todos os
                 símbolos que podem estar envolvidos no
                 processo de resolução de referências entre
                 segmentos: símbolos associados a referências
                 externas (ER), a definições locais (LD) ou a
                 definições de segmentos (SD)
    Diretório de Relocação e Ligação (RLD): para cada segmento
                 indica que posições deverão ter seus conteúdos
                 atualizados de acordo com o posicionamento
                 deste e de outros segmentos na memória



                                                      I NTRODUÇÃO À COMPILAÇÃO
Informação para ajustes
Dicionário de Símbolos Externos (ESD)




         Quais símbolos precisam ser conhecidos entre segmentos
         para resolução das referências
                 ER Referência externa, símbolo que é usado no
                     presente módulo mas definido em outro
                 LD Definição local, símbolo definido no presente
                     módulo que pode ser referenciado em outros




                                                     I NTRODUÇÃO À COMPILAÇÃO
Informação para ajustes
Diretório de Relocação e Ligação (RLD)




         Quais posições de memória no código precisam ser
         ajustadas
               em relação aos valores de símbolos externos
               em relação à posição inicial do próprio segmento
                    Para resolver essa informação, o ESD também deve manter
                    informação sobre a posição de início do segmento
                    SD, definição de segmento




                                                               I NTRODUÇÃO À COMPILAÇÃO
Formato do módulo objeto


  Para realizar os ajustes de ligação e relocação, o módulo
  objeto deve conter registros de quatro tipos:
         ESD Informação sobre nome do símbolo, sua posição
             relativa no segmento e sua dimensão em bytes
         TXT Dimensão e o código de máquina do segmento
         RLD Posição relativa e dimensão das referências que
             precisam ser ajustadas no código de máquina
                 Qual valor (símbolo) usado como base para
                 esse ajuste
        END Endereço para início da execução
               Se o módulo contém programa principal



                                                      I NTRODUÇÃO À COMPILAÇÃO
Exemplo de carregador com ajustes
Carregador de ligação direta




    Execução em duas etapas:
     1. Varredura de todos os módulos que serão ligados para
        definir
               Posição de memória na qual o módulo será carregado
               Definição dos valores dos símbolos externos em uma
               tabela global de símbolos externos
      2. Carregamento do código com realização dos ajustes nas
         posições indicadas no diretório de relocação e ligação




                                                           I NTRODUÇÃO À COMPILAÇÃO
Carregador de ligação direta


   Forma mais simples de operação: em dois passos
    1. Resolução dos endereços
           Aloca espaço em memória
               Define endereço inicial de memória para cada módulo
           Lê registros ESD
               Cria Tabela de Símbolos Externos Globais (GEST)
    2. Transferência e ajustes
           Realiza a transferência dos registros TXT para a memória
           Altera as posições de memória indicadas nos registros
           RLD
               Valores na GEST
           Inicia execução com endereço obtido em um registro END




                                                           I NTRODUÇÃO À COMPILAÇÃO
Desvantagens



      Código do carregador torna-se mais complexo
      Como carregador compartilha memória com a execução
      da aplicação, quanto mais simples for, melhor

  Estratégia alternativa
  Separar as atividades de ligação daquelas do carregamento
      Só o carregador (mais simples) precisa compartilhar a
      memória com a aplicação




                                                     I NTRODUÇÃO À COMPILAÇÃO
Ligadores



     Programa ligador usado para criar um módulo de carga
            Combina os módulos objetos — esforço de ligação já
            realizado
            Mantém informação sobre ajustes de relocação
                Relativos a um único símbolo: endereço inicial de memória

    Exemplo Programa ld do Unix, invocado pelo compilador
            gcc ao final da compilação para criar o código
            executável




                                                              I NTRODUÇÃO À COMPILAÇÃO
Bibliotecas



      Módulos de código objeto de uso comum num sistema
      devem ser mantidos para fácil integração ao código da
      aplicação
      Mecanismo usual para manutenção desses módulos:
      biblioteca
          Arquivo cujo conteúdo é um conjunto de outros arquivos
          (no caso, módulos objetos) com uma tabela para localizar e
          extrair facilmente esses arquivos




                                                        I NTRODUÇÃO À COMPILAÇÃO
Bibliotecas



   Exemplo
   Bibliotecas estáticas em Unix
       Criadas e mantidas com aplicativo ar
       Módulos necessários são extraídos e integrados ao código
       pelo aplicativo ld
       Bibliotecas a serem utilizadas são indicadas com a chave
       -l na linha de comando




                                                      I NTRODUÇÃO À COMPILAÇÃO
Bibliotecas



   Estrutura interna:
        Nome char name[16];
   Data de modificação char modtime[12];
       Usuário char uid[6];
        Grupo char gid[6];
   Permissões de acesso char mode[8];
    Dimensão char size[10];
   Marcador de fim char eol[2];




                                          I NTRODUÇÃO À COMPILAÇÃO
Limitações dos esquemas estáticos


  Esquemas básicos apresentados são estáticos
      Ligadores montam o módulo de carga completo antes da
      execução
      Uma vez definido o endereço para o carregamento, esse
      não pode ser alterado até o fim da execução

  Desvantagem
  Num ambiente que suporta multiprogramação (com execução
  simultânea de vários programas), vários módulos podem estar
  repetidos em diferentes aplicações
      Redundância



                                                   I NTRODUÇÃO À COMPILAÇÃO
Carregamento e ligação dinâmicos




    Princípio adiar a definição do valor de um símbolo externo
              até o momento da execução

      Se um módulo já tiver sido carregado para a memória por
      uma outra aplicação, o mesmo endereço pode ser utilizado




                                                    I NTRODUÇÃO À COMPILAÇÃO
Módulos objetos para ligação dinâmica



      Código dos módulo deve ser reentrante
          Basicamente, sem variáveis globais ou estáticas
      Códigos mantidos em bibliotecas dinâmicas
          Sistema Windows: DLL
          Sistema Linux: ELF (arquivos com extensão .so, de
          shared objects
      Módulo de carga (o programa executável) é um módulo
      primário
          Referências aos módulos externos sem resolução




                                                        I NTRODUÇÃO À COMPILAÇÃO
Estratégias para resolução




   Duas possibilidades:
    1. Referências resolvidas quando módulo primário é
       carregado
    2. Referências resolvidas quando símbolo é referenciado




                                                     I NTRODUÇÃO À COMPILAÇÃO
Resolução em tempo de carregamento


      Quando o módulo de carga primário é carregado, todas as
      referências a módulos externos devem ser resolvidas
      Se módulo já está na memória, mesmo endereço é
      utilizado
      Caso contrário, módulo é carregado e seu endereço é
      definido
      Se algum módulo não for localizado, execução é abortada

  Esquema utilizado no Sistema Windows
        DLL Dynamic Link Library



                                                   I NTRODUÇÃO À COMPILAÇÃO
Resolução em tempo de execução

      Execução inicia com o módulo de carga primário sem
      resolução das referências externas
      Apenas quando a referência é efetivamente necessária o
      sistema faz a resolução
          Se módulo já está na memória, mesmo endereço é
          utilizado
          Caso contrário, módulo é carregado e seu endereço é
          definido
      Se referência não for utilizada, módulo correspondente
      nem precisa ser carregado
          Eventualmente, aplicação pode executar sem a instalação
          da correspondente biblioteca dinâmica

  Esquema utilizado no Sistema Linux
         ELF Executable and Linkable Format
                                                       I NTRODUÇÃO À COMPILAÇÃO
Manipulação de símbolos em ELF




      dlopen abre o arquivo da biblioteca dinâmica
      dlsym obtém endereço do símbolo especificado
      dclose fecha a biblioteca dinâmica
      dlerror emite mensagem de diagnóstico de erro




                                                     I NTRODUÇÃO À COMPILAÇÃO
Exemplo (sem tratamento de erros)


  #include <dlfcn.h>
  #include <stdio.h>
  int main(int argc, char *argv[]) {
    void *handle;
    double (*cosine)(double);
    char *error;
    handle = dlopen("/lib/libm.so.5", RTLD_LAZY);
    cosine = dlsym(handle, "cos");
    printf("%fn", (*cosine)(2.0));
    dlclose(handle);
  }



                                        I NTRODUÇÃO À COMPILAÇÃO
O problema da dependência



  Cadeia de dependências A aplicação depende da biblioteca A,
              que depende da B, que depende. . .

      Em sistemas com muitas aplicações instaladas (e
      desinstaladas), é possível que aplicações parem de
      funcionar por conta de ausência de uma biblioteca
      dinâmica removida inadvertidamente ou por
      incompatibilidade de versões
          Problema conhecido como DLL hell
          Agravado por modificações locais não documentadas e
          pela ausência de um padrão de numeração de versões




                                                     I NTRODUÇÃO À COMPILAÇÃO
O problema da dependência




  Soluções
     Manutenção de um controle de versões, com indicação de
     major version and minor version
     Atualizações de aplicações controladas por meio de um
     gerenciador de pacotes




                                                  I NTRODUÇÃO À COMPILAÇÃO
O panorama geral




         Arquivos texto                 Arquivos binários


    Programa     Programa            Módulo        Módulo de
      fonte      ling simb           objeto       carregamento              sistema
                                                                           operacional



         compilador       montador            ligador       carregador     Processo




                                                                         I NTRODUÇÃO À COMPILAÇÃO

Weitere ähnliche Inhalte

Was ist angesagt?

Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
Jefferson Bessa
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducao
mmind
 
Tecnicas programacao i_c_p3
Tecnicas programacao i_c_p3Tecnicas programacao i_c_p3
Tecnicas programacao i_c_p3
D M
 

Was ist angesagt? (20)

Linguagem C clecioamerico
Linguagem C clecioamericoLinguagem C clecioamerico
Linguagem C clecioamerico
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 
Compiladores 3
Compiladores 3Compiladores 3
Compiladores 3
 
Introdução ao c++
Introdução ao c++Introdução ao c++
Introdução ao c++
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducao
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - Compiladores
 
Linguagem c parte 1
Linguagem c parte 1Linguagem c parte 1
Linguagem c parte 1
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoes
 
Linguagem c parte 2
Linguagem c parte 2Linguagem c parte 2
Linguagem c parte 2
 
Microprocessadores ii revisão de linguagem de programação (parte2)
Microprocessadores ii revisão de linguagem de programação (parte2)Microprocessadores ii revisão de linguagem de programação (parte2)
Microprocessadores ii revisão de linguagem de programação (parte2)
 
Pged 01
Pged 01Pged 01
Pged 01
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Apostila da linguagem c
Apostila da linguagem cApostila da linguagem c
Apostila da linguagem c
 
Cap 2
Cap 2Cap 2
Cap 2
 
Tecnicas programacao i_c_p3
Tecnicas programacao i_c_p3Tecnicas programacao i_c_p3
Tecnicas programacao i_c_p3
 
Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
 

Ähnlich wie Compiladores 7

Lista exercicios algoritmos
Lista exercicios algoritmosLista exercicios algoritmos
Lista exercicios algoritmos
slashmelhor
 
Cartilhado arduino ed10
Cartilhado arduino ed10Cartilhado arduino ed10
Cartilhado arduino ed10
SEDUCCE
 
Introdução à Programacao em Processing
Introdução à Programacao em Processing Introdução à Programacao em Processing
Introdução à Programacao em Processing
Jorge Cardoso
 

Ähnlich wie Compiladores 7 (20)

Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de Computadores
 
Linguagem assembly
Linguagem assemblyLinguagem assembly
Linguagem assembly
 
Aula 02 - Introdução a ALGORITMOS.pptx
Aula 02 - Introdução a ALGORITMOS.pptxAula 02 - Introdução a ALGORITMOS.pptx
Aula 02 - Introdução a ALGORITMOS.pptx
 
Programação de Microprocessadores
Programação de MicroprocessadoresProgramação de Microprocessadores
Programação de Microprocessadores
 
Resumo x86
Resumo x86Resumo x86
Resumo x86
 
Ud2
Ud2Ud2
Ud2
 
Aula 7 conjunto de instrucoes
Aula 7   conjunto de instrucoesAula 7   conjunto de instrucoes
Aula 7 conjunto de instrucoes
 
10 apostila microcontroladores
10  apostila microcontroladores10  apostila microcontroladores
10 apostila microcontroladores
 
Aula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxAula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptx
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programação
 
Lista exercicios algoritmos
Lista exercicios algoritmosLista exercicios algoritmos
Lista exercicios algoritmos
 
F oc aula_02a
F oc aula_02aF oc aula_02a
F oc aula_02a
 
Cartilhado arduino ed1 - cópia
Cartilhado arduino ed1 - cópiaCartilhado arduino ed1 - cópia
Cartilhado arduino ed1 - cópia
 
Cartilhado arduino ed1
Cartilhado arduino ed1Cartilhado arduino ed1
Cartilhado arduino ed1
 
Cartilhado arduino ed1
Cartilhado arduino ed1Cartilhado arduino ed1
Cartilhado arduino ed1
 
Cartilhado arduino ed10
Cartilhado arduino ed10Cartilhado arduino ed10
Cartilhado arduino ed10
 
CartilhadoArduino_ed9.pdf
CartilhadoArduino_ed9.pdfCartilhadoArduino_ed9.pdf
CartilhadoArduino_ed9.pdf
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
 
Introdução à Programacao em Processing
Introdução à Programacao em Processing Introdução à Programacao em Processing
Introdução à Programacao em Processing
 
05-ModeloDeVonNeumann.pdf
05-ModeloDeVonNeumann.pdf05-ModeloDeVonNeumann.pdf
05-ModeloDeVonNeumann.pdf
 

Mehr von Ivan Ricarte

SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
Ivan Ricarte
 

Mehr von Ivan Ricarte (20)

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoes
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnit
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smells
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saude
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software Estatistico
 
Aula UML e Java
Aula UML e JavaAula UML e Java
Aula UML e Java
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junit
 
Introducao a refatoracao
Introducao a refatoracaoIntroducao a refatoracao
Introducao a refatoracao
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1
 
c++ construtores
c++ construtoresc++ construtores
c++ construtores
 
Padroes
PadroesPadroes
Padroes
 
C++ Sobrecarga
C++ SobrecargaC++ Sobrecarga
C++ Sobrecarga
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++
 
UML e POO
UML e POOUML e POO
UML e POO
 
Antipadroes
AntipadroesAntipadroes
Antipadroes
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do software
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
 

Kürzlich hochgeladen

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Kürzlich hochgeladen (6)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Compiladores 7

  • 1. Produção do código executável Ivan Ricarte 2008 I NTRODUÇÃO À COMPILAÇÃO
  • 2. Sumário Interação do compilador com outros aplicativos Montadores Estrutura de programas em linguagem simbólica O processo de montagem Um montador em dois passos Carregadores e ligadores Ligadores Bibliotecas Carregamento e ligação dinâmicos I NTRODUÇÃO À COMPILAÇÃO
  • 3. Interação do compilador com outros aplicativos Compilador atua como front-end para demais aplicativos Com as opções apropriadas, é possível interromper o processo de compilação antes de uma dessas etapas Nos compiladores gcc: -S Não faça a montagem, produto é um arquivo de texto com o código em linguagem simbólica -c Não faça a ligação, produto é um arquivo binário com o código-objeto I NTRODUÇÃO À COMPILAÇÃO
  • 4. Montadores Instruções em linguagem simbólica refletem a arquitetura de cada processador Quais operações podem ser realizadas Que registradores estão disponíveis Quais modos de endereçamento são suportados O programa montador reconhece essas instruções E sabe como realizar a tradução do formato simbólico (texto) para o formato de máquina (binário) Quando montador que executa num processador permite a geração de código de máquina para um outro processador, ele é denominado montador multiplataforma (cross-assembler) I NTRODUÇÃO À COMPILAÇÃO
  • 5. Montadores Traduzem código em linguagem simbólica para linguagem de máquina Específicos para cada processador Facilidades presentes em montadores: Pseudo-instruções Diretivas que não geram código de máquina Facilidades para simplificar codificação em linguagem simbólica Rótulos Identificação simbólica de endereços Macroinstruções Seqüências de instruções associadas a um nome I NTRODUÇÃO À COMPILAÇÃO
  • 6. Estrutura de programas em linguagem simbólica Programas em linguagem simbólica têm estrutura rígida Campo 1 Rótulo (opcional) Associado a identificadores Campo 2 Código de operação Código da instrução do processador ou da pseudo-instrução do montador Campo 3 Operandos Comentários também podem estar presentes I NTRODUÇÃO À COMPILAÇÃO
  • 7. Exemplo de código em linguagem simbólica .file "hello.cpp" .text .align 2 .LCFI2: movl %eax, -4(%ebp) movl %edx, -8(%ebp) cmpl $1, -4(%ebp) jne .L5 I NTRODUÇÃO À COMPILAÇÃO
  • 8. Exemplo de código em linguagem simbólica POS DS.W 1 ; Busca 0 na sequencia de inteiros ; DATUM definido alhures SRCH0 MOVEA.L #DATUM,A0 MOVE.L #DATUM,D0 ; guarda inicio CLR.W D1 LOOP CMP.W (A0)+,D1 BNE LOOP SUB.L A0,D0 MOVE.W D0,POS RTS END I NTRODUÇÃO À COMPILAÇÃO
  • 9. Facilidades presentes em montadores Representação de constantes (exemplos) Inteiro decimal 48 Inteiro hexadecimal $30 Inteiro octal @60 Inteiro binário %110000 Caractere simples ou seqüência ’0’, ’ABC’ I NTRODUÇÃO À COMPILAÇÃO
  • 10. Facilidades presentes em montadores Pseudo-instruções (exemplos) EQU Associação de valores a nomes simbólicos DC Alocação de espaço para variáveis com valores inicializados DS Reserva de espaço para variáveis sem valores inicializados I NTRODUÇÃO À COMPILAÇÃO
  • 11. Facilidades presentes em montadores Pseudo-instruções (exemplos) ORG Definição de segmento (origem) END Sinalização do fim do programa em linguagem simbólica GLOB Indicação de símbolo que pode ser referenciado por outros módulos I NTRODUÇÃO À COMPILAÇÃO
  • 12. Exemplos de uso de pseudo-instruções EQU Definição SIZE EQU 100 ... Uso MOVE #SIZE,D0 I NTRODUÇÃO À COMPILAÇÃO
  • 13. Exemplos de uso de pseudo-instruções DC, DS CONTADOR DC.L 100 ARR1 DC.W 0,1,1,2,3,5,8,13 MENSAGEM DC.B ’Alo, pessoal!’ VALUE DS.W 1 I NTRODUÇÃO À COMPILAÇÃO
  • 14. Exemplos de uso de pseudo-instruções ORG, END SEG1 EQU $1000 ... ORG SEG1 MOVE.W DATA,D0 MOVE.W D0,DATA+2 RTS ... END I NTRODUÇÃO À COMPILAÇÃO
  • 15. Macroinstrução Seqüência de instruções que recebe um nome Futuras referências a esse nome serão substituídas pela seqüência de instruções Podem ter argumentos Definição de macro Em geral, delimitada por pseudo-instruções de início e fim de definição de macro Facilidades na definição da macro Comandos dentro do corpo da macro, para expansão condicional Invocação da macro Substituição do nome referenciado pela sua expansão (instruções e argumentos) I NTRODUÇÃO À COMPILAÇÃO
  • 16. Macro em montadores Exemplo de definição TOLOWER MACRO &IN,&OUT MOVE &IN,D0 ORI 32,D0 MOVE D0,&OUT ENDM Argumento IN é um caráter ASCII Se caráter é uma letra maiúscula, resultado é a letra minúscula correspondente OR imediato com valor 32 — sexto bit é setado D0 é um registrador de dados do processador Resultado é colocado no argumento OUT I NTRODUÇÃO À COMPILAÇÃO
  • 17. Processamento de macros Se todo uso de macro é precedido da correspondente definição, processamento da macro ocorre em um único passo 1. Quando pseudo-instrução MACRO é encontrada, as instruções seguintes (até a pseudo-instrução ENDM, de fim de macro) são armazenadas em uma Tabela de Definição de Macro Associada a essa tabela é armazenada também a lista de parâmetros da macro 2. Quando uma operação utilizada no código é encontrada na Tabela de Definição de Macro, essa referência é substituída pelo conjunto de instruções lá armazenada Parâmetros referenciados na tabela são substituídos pelos argumentos usados na referência à macro I NTRODUÇÃO À COMPILAÇÃO
  • 18. O processo de montagem Características gerais: Pré-processamento para eliminação de comentários e substituição de macros Varreduras por linha, com extração e processamento dos campos Estruturas auxiliares Tabela de instruções de máquina informação necessária para traduzir instruções simbólicas do processador para o correspondente código de máquina Depende do processador Tabela de pseudo-instruções Informação necessária para processar pseudo-instruções do montador Não depende do processador, mas sim do montador I NTRODUÇÃO À COMPILAÇÃO
  • 19. Um montador em dois passos Passo 1 Processamento dos símbolos definidos no código Qual o valor associado a cada símbolo? Resultado armazenado numa tabela de símbolos Passo 2 Geração do código de máquina Utiliza tabela criada no Passo 1 para codificar operandos das instruções de máquina Resultado armazenado em arquivo binário (módulo objeto) I NTRODUÇÃO À COMPILAÇÃO
  • 20. Passo 1 do montador Objetivo do primeiro passo é identificar a posição associada a cada identificador utilizado no código Uma instrução por linha, processada independentemente Identificadores no código assembly: sempre no campo de rótulo Processamento do rótulo: cria entrada na Tabela de Símbolos Para cada identificador, o valor do endereço associado a ele Informação obtida na MOT: quanto espaço é ocupado pela instrução Informação obtida na POT: qual impacto da pseudo-instrução no valor do endereço Altera valor do endereço? (ORG) Precisa reservar espaço no módulo objeto? (DS, DC) Se pseudo-instrução é EQU, entrada na Tabela de Símbolos é criada com o valor do argumento e não do endereço I NTRODUÇÃO À COMPILAÇÃO
  • 21. Montador Passo 2: criação do módulo objeto No segundo passo, cada linha do código é novamente processada Como todas as referências simbólicas foram resolvidas no passo anterior, código de máquina para cada instrução pode ser gerado Para cada instrução do processador, código de operação é obtido da MOT Operandos das instruções: Constante valor para operando obtido do próprio código da instrução (modo imediato) Simbólico valor para operando obtido da Tabela de Símbolos criada no primeiro passo Código binário gerado para cada instrução é agregado a um arquivo com o módulo objeto I NTRODUÇÃO À COMPILAÇÃO
  • 22. Exemplo: código-fonte DATA EQU $6000 PROGRAM EQU $4000 ORG DATA VALUE DS.W 1 RESULT DS.W 1 ORG PROGRAM PGM MOVE.W VALUE,D0 MOVE.W D0,RESULT RTS END PGM I NTRODUÇÃO À COMPILAÇÃO
  • 23. Exemplo: Tabela de símbolos Símbolo Valor DATA $6000 PGM $4000 PROGRAM $4000 RESULT $6002 VALUE $6000 I NTRODUÇÃO À COMPILAÇÃO
  • 24. Exemplo: Código gerado Segmento de dados Posição $6000 $6002 Conteúdo $0000 $0000 Segmento de texto (código) Posição $4000 $4002 $4004 $4006 $4008 $400A $400C Conteúdo $3038 $0000 $6000 $31C0 $0000 $6002 $4E75 I NTRODUÇÃO À COMPILAÇÃO
  • 25. Carregadores e ligadores Módulo objeto criado pelo montador ainda não é executável Pode ter referências a símbolos em outros módulos Variáveis externas Rotinas Precisa ser carregado em memória para execução Pode necessitar ajustes nas referências à memória Programas que executam essas tarefas Ligador Resolve referências entre símbolos de diferentes módulos Carregador transfere código objeto para a memória e dá início à sua execução I NTRODUÇÃO À COMPILAÇÃO
  • 26. Formato do módulo objeto Informação usualmente presente Cabeçalho: contém a identificação do tipo de arquivo e dados sobre o tamanho do código e eventualmente o arquivo que deu origem ao arquivo objeto. Código gerado: contém as instruções e dados em formato binário, apropriado ao carregamento. Relocação: contém as posições no código onde deverá ocorrer mudanças de conteúdo quando for definida a posição de carregamento. Símbolos: contém os símbolos globais definidos no módulo e símbolos cujas definições virão de outros módulos. Depuração: contém referências para o código-fonte, tais como número de linha, nomes originais dos símbolos locais e estruturas de dados definidas. I NTRODUÇÃO À COMPILAÇÃO
  • 27. Estratégias de carregamento e ligação Esquemas absolutos Nesses esquemas, o programador é responsável pela realização dos ajustes Código já contém referências às posições efetivas de memória de variáveis e rotinas Esquemas adequados para sistemas de pequeno porte e monoprogramados Exemplos: Montador combinado com carregador Código gerado já é colocado na memória e não no disco Carregador absoluto Módulo objeto contém referências efetivas à memória e precisa ser carregado em uma posição específica I NTRODUÇÃO À COMPILAÇÃO
  • 28. Montagem e carregamento combinados Desvantagens Responsabilidade do programador de manter endereços Programa montador ocupa memória que poderia ser usada na execução do programa de aplicação Cada execução demanda nova montagem, mesmo que nenhuma alteração tenha ocorrido I NTRODUÇÃO À COMPILAÇÃO
  • 29. Carregamento absoluto Também esquema absoluto Separa montagem do carregamento Montador cria módulo objeto em disco Carregador transfere módulo objeto do disco para a memória principal Outro programa do sistema Módulo objeto deve conter informação para sua operação I NTRODUÇÃO À COMPILAÇÃO
  • 30. Carregamento absoluto Conteúdo do módulo objeto Módulo objeto deve conter informação sobre endereço de memória principal no qual deve ser carregado Um registro para cada segmento contíguo de código Um outro tipo de registro contém o endereço de início de execução Controle da execução é transferido para esse endereço ao final do carregamento I NTRODUÇÃO À COMPILAÇÃO
  • 31. Carregamento absoluto Limitações Programador é responsável por manter o registro dos endereços Localização na memória de variáveis e subrotinas Não há flexibilidade para execução do código Se posição de memória não estiver disponível, programa não pode ser executado I NTRODUÇÃO À COMPILAÇÃO
  • 32. Estratégias de carregamento e ligação Esquemas relocáveis Nesses esquemas, o módulo objeto gerado não tem referências às posições efetivas de memória de variáveis e rotinas, mas relativas a algum endereço-base Quando módulo é carregado, as referências relativas precisam ser resolvidas Módulo objeto precisa manter informação para realização desses ajustes Dois tipos de ajustes relocação: ajuste interno a um módulo ligação: ajuste entre módulos distintos I NTRODUÇÃO À COMPILAÇÃO
  • 33. Esquemas relocáveis Informação presente no módulo objeto Dicionário de Símbolos Externos (ESD): contém todos os símbolos que podem estar envolvidos no processo de resolução de referências entre segmentos: símbolos associados a referências externas (ER), a definições locais (LD) ou a definições de segmentos (SD) Diretório de Relocação e Ligação (RLD): para cada segmento indica que posições deverão ter seus conteúdos atualizados de acordo com o posicionamento deste e de outros segmentos na memória I NTRODUÇÃO À COMPILAÇÃO
  • 34. Informação para ajustes Dicionário de Símbolos Externos (ESD) Quais símbolos precisam ser conhecidos entre segmentos para resolução das referências ER Referência externa, símbolo que é usado no presente módulo mas definido em outro LD Definição local, símbolo definido no presente módulo que pode ser referenciado em outros I NTRODUÇÃO À COMPILAÇÃO
  • 35. Informação para ajustes Diretório de Relocação e Ligação (RLD) Quais posições de memória no código precisam ser ajustadas em relação aos valores de símbolos externos em relação à posição inicial do próprio segmento Para resolver essa informação, o ESD também deve manter informação sobre a posição de início do segmento SD, definição de segmento I NTRODUÇÃO À COMPILAÇÃO
  • 36. Formato do módulo objeto Para realizar os ajustes de ligação e relocação, o módulo objeto deve conter registros de quatro tipos: ESD Informação sobre nome do símbolo, sua posição relativa no segmento e sua dimensão em bytes TXT Dimensão e o código de máquina do segmento RLD Posição relativa e dimensão das referências que precisam ser ajustadas no código de máquina Qual valor (símbolo) usado como base para esse ajuste END Endereço para início da execução Se o módulo contém programa principal I NTRODUÇÃO À COMPILAÇÃO
  • 37. Exemplo de carregador com ajustes Carregador de ligação direta Execução em duas etapas: 1. Varredura de todos os módulos que serão ligados para definir Posição de memória na qual o módulo será carregado Definição dos valores dos símbolos externos em uma tabela global de símbolos externos 2. Carregamento do código com realização dos ajustes nas posições indicadas no diretório de relocação e ligação I NTRODUÇÃO À COMPILAÇÃO
  • 38. Carregador de ligação direta Forma mais simples de operação: em dois passos 1. Resolução dos endereços Aloca espaço em memória Define endereço inicial de memória para cada módulo Lê registros ESD Cria Tabela de Símbolos Externos Globais (GEST) 2. Transferência e ajustes Realiza a transferência dos registros TXT para a memória Altera as posições de memória indicadas nos registros RLD Valores na GEST Inicia execução com endereço obtido em um registro END I NTRODUÇÃO À COMPILAÇÃO
  • 39. Desvantagens Código do carregador torna-se mais complexo Como carregador compartilha memória com a execução da aplicação, quanto mais simples for, melhor Estratégia alternativa Separar as atividades de ligação daquelas do carregamento Só o carregador (mais simples) precisa compartilhar a memória com a aplicação I NTRODUÇÃO À COMPILAÇÃO
  • 40. Ligadores Programa ligador usado para criar um módulo de carga Combina os módulos objetos — esforço de ligação já realizado Mantém informação sobre ajustes de relocação Relativos a um único símbolo: endereço inicial de memória Exemplo Programa ld do Unix, invocado pelo compilador gcc ao final da compilação para criar o código executável I NTRODUÇÃO À COMPILAÇÃO
  • 41. Bibliotecas Módulos de código objeto de uso comum num sistema devem ser mantidos para fácil integração ao código da aplicação Mecanismo usual para manutenção desses módulos: biblioteca Arquivo cujo conteúdo é um conjunto de outros arquivos (no caso, módulos objetos) com uma tabela para localizar e extrair facilmente esses arquivos I NTRODUÇÃO À COMPILAÇÃO
  • 42. Bibliotecas Exemplo Bibliotecas estáticas em Unix Criadas e mantidas com aplicativo ar Módulos necessários são extraídos e integrados ao código pelo aplicativo ld Bibliotecas a serem utilizadas são indicadas com a chave -l na linha de comando I NTRODUÇÃO À COMPILAÇÃO
  • 43. Bibliotecas Estrutura interna: Nome char name[16]; Data de modificação char modtime[12]; Usuário char uid[6]; Grupo char gid[6]; Permissões de acesso char mode[8]; Dimensão char size[10]; Marcador de fim char eol[2]; I NTRODUÇÃO À COMPILAÇÃO
  • 44. Limitações dos esquemas estáticos Esquemas básicos apresentados são estáticos Ligadores montam o módulo de carga completo antes da execução Uma vez definido o endereço para o carregamento, esse não pode ser alterado até o fim da execução Desvantagem Num ambiente que suporta multiprogramação (com execução simultânea de vários programas), vários módulos podem estar repetidos em diferentes aplicações Redundância I NTRODUÇÃO À COMPILAÇÃO
  • 45. Carregamento e ligação dinâmicos Princípio adiar a definição do valor de um símbolo externo até o momento da execução Se um módulo já tiver sido carregado para a memória por uma outra aplicação, o mesmo endereço pode ser utilizado I NTRODUÇÃO À COMPILAÇÃO
  • 46. Módulos objetos para ligação dinâmica Código dos módulo deve ser reentrante Basicamente, sem variáveis globais ou estáticas Códigos mantidos em bibliotecas dinâmicas Sistema Windows: DLL Sistema Linux: ELF (arquivos com extensão .so, de shared objects Módulo de carga (o programa executável) é um módulo primário Referências aos módulos externos sem resolução I NTRODUÇÃO À COMPILAÇÃO
  • 47. Estratégias para resolução Duas possibilidades: 1. Referências resolvidas quando módulo primário é carregado 2. Referências resolvidas quando símbolo é referenciado I NTRODUÇÃO À COMPILAÇÃO
  • 48. Resolução em tempo de carregamento Quando o módulo de carga primário é carregado, todas as referências a módulos externos devem ser resolvidas Se módulo já está na memória, mesmo endereço é utilizado Caso contrário, módulo é carregado e seu endereço é definido Se algum módulo não for localizado, execução é abortada Esquema utilizado no Sistema Windows DLL Dynamic Link Library I NTRODUÇÃO À COMPILAÇÃO
  • 49. Resolução em tempo de execução Execução inicia com o módulo de carga primário sem resolução das referências externas Apenas quando a referência é efetivamente necessária o sistema faz a resolução Se módulo já está na memória, mesmo endereço é utilizado Caso contrário, módulo é carregado e seu endereço é definido Se referência não for utilizada, módulo correspondente nem precisa ser carregado Eventualmente, aplicação pode executar sem a instalação da correspondente biblioteca dinâmica Esquema utilizado no Sistema Linux ELF Executable and Linkable Format I NTRODUÇÃO À COMPILAÇÃO
  • 50. Manipulação de símbolos em ELF dlopen abre o arquivo da biblioteca dinâmica dlsym obtém endereço do símbolo especificado dclose fecha a biblioteca dinâmica dlerror emite mensagem de diagnóstico de erro I NTRODUÇÃO À COMPILAÇÃO
  • 51. Exemplo (sem tratamento de erros) #include <dlfcn.h> #include <stdio.h> int main(int argc, char *argv[]) { void *handle; double (*cosine)(double); char *error; handle = dlopen("/lib/libm.so.5", RTLD_LAZY); cosine = dlsym(handle, "cos"); printf("%fn", (*cosine)(2.0)); dlclose(handle); } I NTRODUÇÃO À COMPILAÇÃO
  • 52. O problema da dependência Cadeia de dependências A aplicação depende da biblioteca A, que depende da B, que depende. . . Em sistemas com muitas aplicações instaladas (e desinstaladas), é possível que aplicações parem de funcionar por conta de ausência de uma biblioteca dinâmica removida inadvertidamente ou por incompatibilidade de versões Problema conhecido como DLL hell Agravado por modificações locais não documentadas e pela ausência de um padrão de numeração de versões I NTRODUÇÃO À COMPILAÇÃO
  • 53. O problema da dependência Soluções Manutenção de um controle de versões, com indicação de major version and minor version Atualizações de aplicações controladas por meio de um gerenciador de pacotes I NTRODUÇÃO À COMPILAÇÃO
  • 54. O panorama geral Arquivos texto Arquivos binários Programa Programa Módulo Módulo de fonte ling simb objeto carregamento sistema operacional compilador montador ligador carregador Processo I NTRODUÇÃO À COMPILAÇÃO