compiladores 7

54
I NTRODUÇÃO À COMPILAÇÃO Produção do código executável Ivan Ricarte 2008

Upload: ivan-ricarte

Post on 06-Jun-2015

792 views

Category:

Technology


3 download

DESCRIPTION

Material de apoio do livro Introdução à Compilação

TRANSCRIPT

Page 1: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Produção do código executável

Ivan Ricarte

2008

Page 2: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Sumário

Interação do compilador com outros aplicativos

MontadoresEstrutura de programas em linguagem simbólicaO processo de montagemUm montador em dois passos

Carregadores e ligadoresLigadoresBibliotecasCarregamento e ligação dinâmicos

Page 3: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Interação do compilador com outros aplicativos

I Compilador atua como front-end para demais aplicativosI Com as opções apropriadas, é possível interromper o

processo de compilação antes de uma dessas etapasI Nos compiladores gcc:

-S Não faça a montagem, produto é um arquivode texto com o código em linguagemsimbólica

-c Não faça a ligação, produto é um arquivobinário com o código-objeto

Page 4: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Montadores

I Instruções em linguagem simbólica refletem a arquiteturade cada processador

I Quais operações podem ser realizadasI Que registradores estão disponíveisI Quais modos de endereçamento são suportados

I O programa montador reconhece essas instruçõesI E sabe como realizar a tradução do formato simbólico

(texto) para o formato de máquina (binário)I Quando montador que executa num processador permite

a geração de código de máquina para um outroprocessador, ele é denominado montador multiplataforma(cross-assembler)

Page 5: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Montadores

I Traduzem código em linguagem simbólica para linguagemde máquina

I Específicos para cada processadorI Facilidades presentes em montadores:

Pseudo-instruções Diretivas que não geram código demáquina

I Facilidades para simplificar codificação emlinguagem simbólica

Rótulos Identificação simbólica de endereçosMacroinstruções Seqüências de instruções associadas a

um nome

Page 6: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Estrutura de programas em linguagem simbólica

I Programas em linguagem simbólica têm estrutura rígidaCampo 1 Rótulo (opcional)

I Associado a identificadoresCampo 2 Código de operação

I Código da instrução do processador ou dapseudo-instrução do montador

Campo 3 OperandosI Comentários também podem estar presentes

Page 7: Compiladores 7

INTRODUÇÃ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

Page 8: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplo de código em linguagem simbólica

POS DS.W 1; Busca 0 na sequencia de inteiros; DATUM definido alhuresSRCH0 MOVEA.L #DATUM,A0

MOVE.L #DATUM,D0 ; guarda inicioCLR.W D1

LOOP CMP.W (A0)+,D1BNE LOOPSUB.L A0,D0MOVE.W D0,POSRTSEND

Page 9: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Facilidades presentes em montadoresRepresentação de constantes (exemplos)

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

Page 10: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Facilidades presentes em montadoresPseudo-instruções (exemplos)

EQUAssociação de valores a nomes simbólicos

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

DSReserva de espaço para variáveis sem valores inicializados

Page 11: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Facilidades presentes em montadoresPseudo-instruções (exemplos)

ORGDefinição de segmento (origem)

ENDSinalização do fim do programa em linguagem simbólica

GLOBIndicação de símbolo que pode ser referenciado por outrosmódulos

Page 12: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplos de uso de pseudo-instruçõesEQU

DefiniçãoSIZE EQU 100

. . .

UsoMOVE #SIZE,D0

Page 13: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplos de uso de pseudo-instruçõesDC, DS

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

Page 14: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplos de uso de pseudo-instruçõesORG, END

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

Page 15: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Macroinstrução

I Seqüência de instruções que recebe um nomeI Futuras referências a esse nome serão substituídas pela

seqüência de instruçõesI Podem ter argumentos

Definição de macro Em geral, delimitada porpseudo-instruções de início e fim de definição demacro

Facilidades na definição da macro Comandos dentro do corpoda macro, para expansão condicional

Invocação da macro Substituição do nome referenciado pelasua expansão (instruções e argumentos)

Page 16: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Macro em montadoresExemplo de definição

TOLOWER MACRO &IN,&OUTMOVE &IN,D0ORI 32,D0MOVE D0,&OUTENDM

I Argumento IN é um caráter ASCIII Se caráter é uma letra maiúscula, resultado é a letra

minúscula correspondenteI OR imediato com valor 32 — sexto bit é setadoI D0 é um registrador de dados do processador

I Resultado é colocado no argumento OUT

Page 17: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Processamento de macros

I Se todo uso de macro é precedido da correspondentedefinição, processamento da macro ocorre em um únicopasso

1. Quando pseudo-instrução MACRO é encontrada, asinstruções seguintes (até a pseudo-instrução ENDM, de fimde macro) são armazenadas em uma Tabela de Definiçãode Macro

I Associada a essa tabela é armazenada também a lista deparâmetros da macro

2. Quando uma operação utilizada no código é encontrada naTabela de Definição de Macro, essa referência ésubstituída pelo conjunto de instruções lá armazenada

I Parâmetros referenciados na tabela são substituídos pelosargumentos usados na referência à macro

Page 18: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

O processo de montagem

Características gerais:I Pré-processamento para eliminação de comentários e

substituição de macrosI Varreduras por linha, com extração e processamento dos

campos

Estruturas auxiliaresTabela de instruções de máquina informação necessária para

traduzir instruções simbólicas do processadorpara o correspondente código de máquina

I Depende do processadorTabela de pseudo-instruções Informação necessária para

processar pseudo-instruções do montadorI Não depende do processador, mas sim do

montador

Page 19: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Um montador em dois passos

Passo 1 Processamento dos símbolos definidos no códigoI Qual o valor associado a cada símbolo?I Resultado armazenado numa tabela de

símbolosPasso 2 Geração do código de máquina

I Utiliza tabela criada no Passo 1 para codificaroperandos das instruções de máquina

I Resultado armazenado em arquivo binário(módulo objeto)

Page 20: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Passo 1 do montadorObjetivo do primeiro passo é identificar a posição associada acada identificador utilizado no código

I Uma instrução por linha, processada independentementeI Identificadores no código assembly: sempre no campo de

rótuloI Processamento do rótulo: cria entrada na Tabela de

SímbolosI Para cada identificador, o valor do endereço associado a

eleI Informação obtida na MOT: quanto espaço é ocupado pela

instruçãoI Informação obtida na POT: qual impacto da

pseudo-instrução no valor do endereçoI Altera valor do endereço? (ORG)I Precisa reservar espaço no módulo objeto? (DS, DC)

I Se pseudo-instrução é EQU, entrada na Tabela de Símbolosé criada com o valor do argumento e não do endereço

Page 21: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

MontadorPasso 2: criação do módulo objeto

I No segundo passo, cada linha do código é novamenteprocessada

I Como todas as referências simbólicas foram resolvidas nopasso anterior, código de máquina para cada instruçãopode ser gerado

I Para cada instrução do processador, código de operação éobtido da MOT

I 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 passoI Código binário gerado para cada instrução é agregado a

um arquivo com o módulo objeto

Page 22: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplo: código-fonte

DATA EQU $6000PROGRAM EQU $4000

ORG DATAVALUE DS.W 1RESULT DS.W 1

ORG PROGRAMPGM MOVE.W VALUE,D0

MOVE.W D0,RESULTRTSEND PGM

Page 23: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplo: Tabela de símbolos

Símbolo ValorDATA $6000PGM $4000PROGRAM $4000RESULT $6002VALUE $6000

Page 24: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplo: Código gerado

Segmento de dadosPosiçã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

Page 25: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Carregadores e ligadores

Módulo objeto criado pelo montador ainda não é executávelI Pode ter referências a símbolos em outros módulos

I Variáveis externasI Rotinas

I Precisa ser carregado em memória para execuçãoI Pode necessitar ajustes nas referências à memória

Programas que executam essas tarefasLigador Resolve referências entre símbolos de diferentes

módulosCarregador transfere código objeto para a memória e dá início

à sua execução

Page 26: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Formato do módulo objetoInformação usualmente presente

Cabeçalho: contém a identificação do tipo de arquivo e dadossobre o tamanho do código e eventualmente oarquivo que deu origem ao arquivo objeto.

Código gerado: contém as instruções e dados em formatobinário, apropriado ao carregamento.

Relocação: contém as posições no código onde deveráocorrer mudanças de conteúdo quando fordefinida a posição de carregamento.

Símbolos: contém os símbolos globais definidos no módulo esímbolos cujas definições virão de outrosmódulos.

Depuração: contém referências para o código-fonte, tais comonúmero de linha, nomes originais dos símboloslocais e estruturas de dados definidas.

Page 27: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Estratégias de carregamento e ligaçãoEsquemas absolutos

I Nesses esquemas, o programador é responsável pelarealização dos ajustes

I Código já contém referências às posições efetivas dememória de variáveis e rotinas

I Esquemas adequados para sistemas de pequeno porte emonoprogramados

Exemplos:Montador combinado com carregador Código gerado já é

colocado na memória e não no discoCarregador absoluto Módulo objeto contém referências

efetivas à memória e precisa ser carregado emuma posição específica

Page 28: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Montagem e carregamento combinadosDesvantagens

I Responsabilidade do programador de manter endereçosI Programa montador ocupa memória que poderia ser

usada na execução do programa de aplicaçãoI Cada execução demanda nova montagem, mesmo que

nenhuma alteração tenha ocorrido

Page 29: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Carregamento absoluto

I Também esquema absolutoI Separa montagem do carregamento

I Montador cria módulo objeto em discoI Carregador transfere módulo objeto do disco para a

memória principalI Outro programa do sistemaI Módulo objeto deve conter informação para sua operação

Page 30: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Carregamento absolutoConteúdo do módulo objeto

Módulo objeto deve conter informação sobre endereço dememória principal no qual deve ser carregado

I Um registro para cada segmento contíguo de códigoI Um outro tipo de registro contém o endereço de início de

execuçãoI Controle da execução é transferido para esse endereço ao

final do carregamento

Page 31: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Carregamento absolutoLimitações

I Programador é responsável por manter o registro dosendereços

I Localização na memória de variáveis e subrotinasI Não há flexibilidade para execução do código

I Se posição de memória não estiver disponível, programanão pode ser executado

Page 32: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Estratégias de carregamento e ligaçãoEsquemas relocáveis

I Nesses esquemas, o módulo objeto gerado não temreferências às posições efetivas de memória de variáveis erotinas, mas relativas a algum endereço-base

I Quando módulo é carregado, as referências relativasprecisam ser resolvidas

I Módulo objeto precisa manter informação para realizaçãodesses ajustes

Dois tipos de ajustesrelocação: ajuste interno a um módulo

ligação: ajuste entre módulos distintos

Page 33: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Esquemas relocáveisInformação presente no módulo objeto

Dicionário de Símbolos Externos (ESD): contém todos ossímbolos que podem estar envolvidos noprocesso de resolução de referências entresegmentos: símbolos associados a referênciasexternas (ER), a definições locais (LD) ou adefinições de segmentos (SD)

Diretório de Relocação e Ligação (RLD): para cada segmentoindica que posições deverão ter seus conteúdosatualizados de acordo com o posicionamentodeste e de outros segmentos na memória

Page 34: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Informação para ajustesDicionário de Símbolos Externos (ESD)

I Quais símbolos precisam ser conhecidos entre segmentospara resolução das referências

ER Referência externa, símbolo que é usado nopresente módulo mas definido em outro

LD Definição local, símbolo definido no presentemódulo que pode ser referenciado em outros

Page 35: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Informação para ajustesDiretório de Relocação e Ligação (RLD)

I Quais posições de memória no código precisam serajustadas

I em relação aos valores de símbolos externosI em relação à posição inicial do próprio segmento

I Para resolver essa informação, o ESD também deve manterinformação sobre a posição de início do segmento

I SD, definição de segmento

Page 36: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Formato do módulo objeto

Para realizar os ajustes de ligação e relocação, o móduloobjeto deve conter registros de quatro tipos:

ESD Informação sobre nome do símbolo, sua posiçãorelativa no segmento e sua dimensão em bytes

TXT Dimensão e o código de máquina do segmentoRLD Posição relativa e dimensão das referências que

precisam ser ajustadas no código de máquinaI Qual valor (símbolo) usado como base para

esse ajusteEND Endereço para início da execução

I Se o módulo contém programa principal

Page 37: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Exemplo de carregador com ajustesCarregador de ligação direta

Execução em duas etapas:1. Varredura de todos os módulos que serão ligados para

definirI Posição de memória na qual o módulo será carregadoI 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 nasposições indicadas no diretório de relocação e ligação

Page 38: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Carregador de ligação direta

Forma mais simples de operação: em dois passos1. Resolução dos endereços

I Aloca espaço em memóriaI Define endereço inicial de memória para cada módulo

I Lê registros ESDI Cria Tabela de Símbolos Externos Globais (GEST)

2. Transferência e ajustesI Realiza a transferência dos registros TXT para a memóriaI Altera as posições de memória indicadas nos registros

RLDI Valores na GEST

I Inicia execução com endereço obtido em um registro END

Page 39: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Desvantagens

I Código do carregador torna-se mais complexoI Como carregador compartilha memória com a execução

da aplicação, quanto mais simples for, melhor

Estratégia alternativaSeparar as atividades de ligação daquelas do carregamento

I Só o carregador (mais simples) precisa compartilhar amemória com a aplicação

Page 40: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Ligadores

I Programa ligador usado para criar um módulo de cargaI Combina os módulos objetos — esforço de ligação já

realizadoI Mantém informação sobre ajustes de relocação

I Relativos a um único símbolo: endereço inicial de memória

Exemplo Programa ld do Unix, invocado pelo compiladorgcc ao final da compilação para criar o códigoexecutável

Page 41: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Bibliotecas

I Módulos de código objeto de uso comum num sistemadevem ser mantidos para fácil integração ao código daaplicação

I Mecanismo usual para manutenção desses módulos:biblioteca

I Arquivo cujo conteúdo é um conjunto de outros arquivos(no caso, módulos objetos) com uma tabela para localizar eextrair facilmente esses arquivos

Page 42: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Bibliotecas

ExemploBibliotecas estáticas em Unix

I Criadas e mantidas com aplicativo ar

I Módulos necessários são extraídos e integrados ao códigopelo aplicativo ld

I Bibliotecas a serem utilizadas são indicadas com a chave-l na linha de comando

Page 43: Compiladores 7

INTRODUÇÃ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];

Page 44: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Limitações dos esquemas estáticos

Esquemas básicos apresentados são estáticosI Ligadores montam o módulo de carga completo antes da

execuçãoI Uma vez definido o endereço para o carregamento, esse

não pode ser alterado até o fim da execução

DesvantagemNum ambiente que suporta multiprogramação (com execuçãosimultânea de vários programas), vários módulos podem estarrepetidos em diferentes aplicações

I Redundância

Page 45: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Carregamento e ligação dinâmicos

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

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

Page 46: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Módulos objetos para ligação dinâmica

I Código dos módulo deve ser reentranteI Basicamente, sem variáveis globais ou estáticas

I Códigos mantidos em bibliotecas dinâmicasI Sistema Windows: DLLI Sistema Linux: ELF (arquivos com extensão .so, de

shared objectsI Módulo de carga (o programa executável) é um módulo

primárioI Referências aos módulos externos sem resolução

Page 47: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Estratégias para resolução

Duas possibilidades:1. Referências resolvidas quando módulo primário é

carregado2. Referências resolvidas quando símbolo é referenciado

Page 48: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Resolução em tempo de carregamento

I Quando o módulo de carga primário é carregado, todas asreferências a módulos externos devem ser resolvidas

I Se módulo já está na memória, mesmo endereço éutilizado

I Caso contrário, módulo é carregado e seu endereço édefinido

I Se algum módulo não for localizado, execução é abortada

Esquema utilizado no Sistema WindowsDLL Dynamic Link Library

Page 49: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Resolução em tempo de execução

I Execução inicia com o módulo de carga primário semresolução das referências externas

I Apenas quando a referência é efetivamente necessária osistema faz a resolução

I Se módulo já está na memória, mesmo endereço éutilizado

I Caso contrário, módulo é carregado e seu endereço édefinido

I Se referência não for utilizada, módulo correspondentenem precisa ser carregado

I Eventualmente, aplicação pode executar sem a instalaçãoda correspondente biblioteca dinâmica

Esquema utilizado no Sistema LinuxELF Executable and Linkable Format

Page 50: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

Manipulação de símbolos em ELF

dlopen abre o arquivo da biblioteca dinâmicadlsym obtém endereço do símbolo especificado

dclose fecha a biblioteca dinâmicadlerror emite mensagem de diagnóstico de erro

Page 51: Compiladores 7

INTRODUÇÃ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("%f\n", (*cosine)(2.0));dlclose(handle);

}

Page 52: Compiladores 7

INTRODUÇÃ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. . .

I Em sistemas com muitas aplicações instaladas (edesinstaladas), é possível que aplicações parem defuncionar por conta de ausência de uma bibliotecadinâmica removida inadvertidamente ou porincompatibilidade de versões

I Problema conhecido como DLL hellI Agravado por modificações locais não documentadas e

pela ausência de um padrão de numeração de versões

Page 53: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

O problema da dependência

SoluçõesI Manutenção de um controle de versões, com indicação de

major version and minor versionI Atualizações de aplicações controladas por meio de um

gerenciador de pacotes

Page 54: Compiladores 7

INTRODUÇÃO À COMPILAÇÃO

O panorama geral

Arquivos bináriosArquivos texto

Programafonte

Programaling simb

Móduloobjeto

compilador montador ligador carregador

carregamentoMódulo de

Processo

sistemaoperacional