65
DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 594 10. Software de Sistema - Carrega- dores e Ligadores Referências: • Introdução à Compilação (capítulo 7) Ivan L. M. Ricarte Editora Campus-Elsevier, 2008 ISBN 85-352-3067-X

10. Software de Sistema - Carrega- dorese Ligadoresleopini/DISCIPLINAS/EA869/2018-1/n1... · próximo slide. DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof

  • Upload
    lehanh

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 594

10. Software de Sistema - Carrega-

dores e Ligadores

Referências:

• Introdução à Compilação (capítulo 7)‏Ivan L. M. Ricarte

• Editora Campus-Elsevier, 2008

• ISBN 85-352-3067-X

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 595

Carregadores e Ligadores

CarregadoresMontadorCompiladores

Sistema Operacional(Gerenciador de Processador, Memória, E/S, etc)‏

Microprogramas

Circuitos Físicos

LigadoresProcessadorde Macro

Depuradores

ProgramasUtilitários

Programasde Aplicação

UsuárioSoftwareAplicativo

SoftwaredeSistema

Hardware

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 596

No capítulo anterior foi apresentado o programa montador.

Ao final da execução do montador já foi carregadodiretamente na memória o programa do usuário (em linguagem de máquina) a ser executado.

O esquema usual de processamento é apresentado na próxima transparência.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 597

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 598

10.1 Módulo Objeto

• artefato produzido pelo montador• última etapa do processo de tradução

• contém a informação necessária para que o programa venha a ser executado• no mínimo, o código de máquina

Devemos notar que, para fim de um melhor entendimento do Programa Montador, no capítulo 9 foi feita a simplificação do Programa Montador gerar diretamente o PLM (Programa em Linguagem de Máquina). Esta é uma das possibilidades (ver 10.2.a).

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 599

Conteúdo do módulo objeto

Tipicamente contendo a seguinte informação:

Cabeçalho: identificação do tipo de arquivo e dados sobre tamanho do código e arquivo-fonte que deu origem ao módulo

Código: instruções e dados em formato binário

Relocação: posições no código binário que devem ter conteúdo alterado de acordo com a posição de carregamento na memória

Símbolos: símbolos globais definidos no módulo e símbolos cujas definições virão de outros módulos (ligação)‏

Depuração: referências para o código fonte, tais como o número de linha, nomes originais dos símbolos locais e estruturas de dados definidas

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 600

Informação que é gerada pelo montador depende muito da forma como o módulo objeto éutilizado

Algumas possibilidades

a - montagem e carregamento combinados

b - carregamento absoluto

c - carregamento com ajuste de referências

Formato do módulo objeto

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 601

10.2 Esquemas de carregamento

• esquema de montagem é com endereço absoluto

• programador é responsável por definir endereços de memória principal nos quais código e dados serão carregados para execução

• ao invés de gerar um módulo objeto em um arquivo em disco, neste caso o código gerado pelo montador jáé escrito diretamente na sua posição de memória

• ao encerrar a montagem, montador transfere a execução (JUMP) para o início do código da aplicação (atenção: por simplificação, não estamos considerando aqui intervenção do sistema operacional)

a) Montagem e carregamento combinados(esquema utilizado no capítulo 9)‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 602

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

a) Montagem e carregamento combinados(esquema utilizado no capítulo 9)‏

10.2 Esquemas de carregamento

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 603

10.2 Esquemas de carregamento

• esquema de montagem também com endereçamento absoluto

• montagem e carregamento em momentos distintos• montador cria módulo objeto em disco

• carregador transfere módulo objeto do disco para a memória principal

• carregador e montador são programas separados

• módulo objeto deve conter informação para a sua manipulação pelo carregador.

b) Carregamento absoluto

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 604

10.2 Esquemas de carregamento

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 (atenção: por simplificação, não estamos considerando aqui intervenção do sistema operacional)

b) Carregamento absoluto

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 605

10.2 Esquemas de carregamento

b) Carregamento absoluto

Relação Montador x Carregador Absoluto

O programa Montador gera um arquivo para ser trabalhado pelo programa Carregador Absoluto com o seguinte formato de campos:

• campo 1: tipo (0-texto; 1-fim)‏

• campo 2: endereço de carregamento

• campo 3: comprimento em bytes

• campo 4: conteúdo binário (em hexadecimal)‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 606

Fluxograma de um Carregador Absoluto

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 607

10.2 Esquemas de carregamento

b) Carregamento absoluto

Exemplo:

DATA: EQU $6000PROG: EQU $4000

ORG DATAVALUE: DS.W 1RESULT: DS.W 1

ORG PROGPGM: MOVE.W VALUE, D0

MOVE.W D0, RESULTRTSEND PROG

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 608

10.2 Esquemas de carregamento

b) Carregamento absoluto

CP Código

DATA: EQU $6000 0000

PROG: EQU $4000 0000

ORG DATA 0000

VALUE: DS.W 1 6000 0000

RESULT: DS.W 1 6002 0000

ORG PROG 6004

PGM: MOVE.W VALUE, D0 4000 30386000

MOVE.W D0, RESULT 4004 31C06002

RTS 4008 4E75

END PROG

valor do CP após cada iteração do montador passo 2

próximo slide

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 609

10.2 Esquemas de carregamento

b) Carregamento absoluto

Exemplo Montador

0 6000 4 00 00 00 00

0 4000 A 30 38 60 00 31 C0 60 02 4E 75

1 4000

Carregador Absoluto

código na memória

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 610

10.2 Esquemas de carregamento

b) Carregamento absoluto

Limitações

• programador é responsável por manter o registro de endereços• por exemplo, localização na memória de

variáveis e subrotinas• não há flexibilidade para execução do código

• caso as posições de memória não estejam disponíveis, programa não pode ser carregado e executado

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 611

10.2 Esquemas de carregamento

c) Carregamento com ajuste a referências

Este carregador procura superar limitações do carregador absoluto como a seguir:

1. não fixando endereços na programação• referências relativas ao início do código

2. é responsabilidade do carregador encontrar espaço de memória para o carregamento

• após definida a posição de carregamento, cabe ao carregador realizar a transferência e os ajustes nas referências

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 612

10.2 Esquemas de carregamento

c) Carregamento com ajuste a referências

Tipos de ajuste

Relocação - referências que são resolvidas com o conhecimento da posição inicial do próprio segmento.

• ajuste interno ao segmento de programa

Ligação - referências que demandam conhecimento da posição inicial de outros segmentos para resolução

• ajuste entre segmentos distintos do programa

O módulo objeto deve agregar informação suficiente para que esses ajustes possam ser realizados.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 613

10.2 Esquemas de carregamento

c) Carregamento com ajuste a referências

Informações para ajustes: (ESD e RLD) ‏

• referência externa – símbolo é usado no presente segmento, mas definido em outro

• definição local – símbolo definido no presente segmento, mas pode ser referenciado em outros

• Dicionário de Símbolos Externos (ESD) ‏

• Símbolos que necessitam ser conhecidos entre segmentos de programas para resolução de referências: LD e SD.

• LD: definição local – símbolo definido no presente segmento, mas pode ser referenciado em outros

• SD: usado para definir segmento

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 614

10.2 Esquemas de carregamento

c) Carregamento com ajuste a referências

Informações para ajustes: (ESD e RLD) ‏

• Diretório de Relocação e Ligação (RLD) ‏

• definição das posições de memória que necessitam de ajuste em relação a:

• valores de símbolos externos

• valor da posição inicial do próprio segmento

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 615

10.2 Esquemas de carregamento

c) Carregamento com ajuste a referências

Formato usado para o Módulo Objeto

O módulo objeto de cada um dos segmentos usará 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 segmentoRLD - 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 (símbolo-base)

END – indica o fim de um segmento e, caso este segmento contenha o programa principal, indica também o endereço de início de sua execução

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 616

10.2 Esquemas de carregamento

c) Carregamento com ajuste a referências

Formato dos registros:

ESD.nome-símbolo.tipo-símbolo.endereço-relativo.comprimento

onde: tipo-símbolo é LD ou SD (ver transparência 613) ‏

comprimento é em bytes

TXT.endereço-relativo.comprimento.código-em-hexadeximal

RLD.endereço-relativo.comprimento.nome-símbolo-base

END.endereço-de-execução

endereço-de-execução é vazio se não for o segmento principal.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 617

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências

MAIN MOVE.B DIGIT, D0

CMPI.B #10, D0

BLT ADD_0

ADDQ.B #(´A´-´0´- 10), D0

ADD_0 ADDI.B # ´0´, D0

MOVE.B D0, CHAR

RTS

CHAR DS.W 1

END MAIN

GLOB DIGIT

PGM MOVE.W VALUE, D0

MOVE.W D0, DIGIT

RTS

VALUE DS.W 1

DIGIT DS.W 1

END

Programa fonte para um processador Motorola da família 68000

Segmento MAIN Segmento PGM

41-30-A=7

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 618

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

MAIN MOVE.B DIGIT, D0

CMPI.B #10, D0

BLT ADD_0

ADDQ.B #(´A´-´0´- 10), D0

ADD_0 ADDI.B # ´0´, D0

MOVE.B D0, CHAR

RTS

CHAR DS.W 1

END MAIN

ESD.´MAIN´.´SD´.0000.001CTXT.00.6.103900000000TXT.06.4.0C00000ATXT.0A.2.6D02TXT.0C.2.5E00TXT.0E.4.06000030TXT.12.6.13C00000001ATXT.18.2.4E75TXT.1A.2.0000RLD.02.4.´DIGIT´RLD.14.4.´MAIN´END.00

Programa fonte para um processador Motorola da família 68000

Segmento MAIN Segmento MAIN – traduzido

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 619

para MAIN: ESD.´MAIN´.´SD´.0000.001C

TXT.00.6.103900000000

TXT.06.4.0C00000A

TXT.0A.2.6D02

TXT.0C.2.5E00

TXT.0E.4.06000030

TXT.12.6.13C00000001A

TXT.18.2.4E75

TXT.1A.2.0000

RLD.02.4.´DIGIT´

RLD.14.4.´MAIN´

END.00

obs.: estes endereços estão em 32 bits (arquitetura do M68000)

endereços com notação em 1 byte

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 620

Para MAIN: ESD.´MAIN´.´SD´.0000.001C

TXT.00.6.103900000000

TXT.06.4.0C00000A

TXT.0A.2.6D02

TXT.0C.2.5E00

TXT.0E.4.06000030

TXT.12.6.13C00000001A

TXT.18.2.4E75

TXT.1A.2.0000

RLD.02.4.´DIGIT´

RLD.14.4.´MAIN´

END.00

obs.: estes endereços estão em 32 bits (arquitetura do M68000)

endereços com notação em 1 byte

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

é CHAR

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 621

Para MAIN: ESD.´MAIN´.´SD´.0000.001C

TXT.00.6.103900000000

TXT.06.4.0C00000A

TXT.0A.2.6D02

TXT.0C.2.5E00

TXT.0E.4.06000030

TXT.12.6.13C00000001A

TXT.18.2.4E75

TXT.1A.2.0000

RLD.02.4.´DIGIT´

RLD.14.4.´MAIN´

END.00

MOVE.B DIGIT,D0

RLD permite ao passo-2 definir aqui o endereço externo de DIGIT

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 622

Para MAIN: ESD.´MAIN´.´SD´.0000.001C

TXT.00.6.103900000000

TXT.06.4.0C00000A

TXT.0A.2.6D02

TXT.0C.2.5E00

TXT.0E.4.06000030

TXT.12.6.13C00000001A

TXT.18.2.4E75

TXT.1A.2.0000

RLD.02.4.´DIGIT´

RLD.14.4.´MAIN´

END.00

RLD permite ao passo-2 definir aqui o endereço de CHAR relativo a MAIN

MOVE.B D0,CHAR

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 623

Para PGM: ESD.´PGM´.´SD´.0000.0012

ESD.´DIGIT´.´LD´.10.2

TXT.00.6.30390000000E

TXT.06.6.33C000000010

TXT.0C.2.4E75

TXT.0E.2.0000

TXT.10.2.0000

RLD.02.4.´PGM´

RLD.08.4.´PGM´

END.

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 624

ESD.´PGM´.´SD´.0000.0012

ESD.´DIGIT´.´LD´.10.2

TXT.00.6.30390000000E

TXT.06.6.33C000000010

TXT.0C.2.4E75

TXT.0E.2.0000

TXT.10.2.0000

RLD.02.4.´PGM´

RLD.08.4.´PGM´

END.

10.3 Exemplo de código gerado por montador

para futuro ajuste a referências (cont.)

Ao final do processamento o montador gerou dois segmentos: MAIN e PGM

ESD.´MAIN´.´SD´.0000.001CTXT.00.6.103900000000TXT.06.4.0C00000ATXT.0A.2.6D02TXT.0C.2.5E00TXT.0E.4.06000030TXT.12.6.13C00000001ATXT.18.2.4E75TXT.1A.2.0000RLD.02.4.´DIGIT´RLD.14.4.´MAIN´END.00

Segmento Main Segmento PGM

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 625

10.4 Carregador de ligação direta

(carregamento com ajuste a referências)‏

Carregadores de ligação direta são exemplo de um carregador básico que realiza ajustes de relocação e ligação a partir dos códigos objeto com o formato apresentado (slide anterior).

Tarefas do carregador de ligação direta:

• alocar espaço na memória principal que seja suficiente para carregar o programa completo (todos os segmentos)

• resolver, definir endereços de cada símbolo exportado pelos módulos / segmentos

• transferir o código de cada módulo/segmento para a memória• ajustar, no código, posições de memória que fazem referências a

outras posições de memória

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 626

10.4 Carregador de ligação direta

(carregamento com ajuste a referências)‏

Implementação em dois passos:

Passo-1: Resolução dos endereços• aloca espaço em memória

• define endereço inicial de memória para cada módulo/segmento• lê registros ESD

• cria Tabela de Símbolos Externos Globais (GEST) ‏

Passo-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

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 627

10.4 Carregador de ligação direta

Passo-1

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 628

10.4 Carregador de ligação direta

Passo-2

ATENÇÃOconvenção

se POS ≠ { }

execuçãoSIZE:=campo tamanho

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 629

10.4 Carregador de ligação direta

Exemplo – conforme transparências 617 a 622.

Executando o algoritmo – Passo 1 (para segmento MAIN) ‏

passo1: PLA=end_inicial (definido como ‏($1000

registro é tipo ESD / SD, assim VALOR= $1000

SCOMP= $001C

SIMB= ´MAIN´

insere na GEST (MAIN , $1000)‏

pula outros registros até encontrar registro END

faz PLA= $1000 + $001C (lembrar $1C é o tamanho do seg. MAIN)‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 630

10.4 Carregador de ligação direta

Exemplo – cont.

Continuando o passo1 agora para PGM:

passo1: PLA= $101C

registro é tipo ESD / SD, assim VALOR= $101C

SCOMP= $0012

SIMB= ´PGM´

insere na GEST (PGM , $101C) ‏

registro é tipo ESD / LD, assim POS= $10

VALOR= $101C + $10 = $102C

SIMB= ´DIGIT´

insere na GEST (DIGIT , $102C)‏

pula outros registros até encontrar registro END

faz PLA= $101C + $0012 (lembrar $12 é o tamanho do seg. PGM)‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 631

10.4 Carregador de ligação direta

Exemplo – cont.

Ao final do passo1 temos a GEST gerada:

GEST:$102CDIGIT

$101CPGM

$1000MAIN

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 632

Inicia passo2 para MAIN e depois continua passo2 para PGM

passo2: PLA= $1000 ; EXE= $1000

registro é tipo ESD / SD, assim SCOMP= $1C

registro é tipo TXT: POS=0, SIZE= $6, CODE � cód. máquina

pos. memória PLA+POS recebe SIZE-bytes com CODE

repete processamento igual ao do último registro para todos

os regs. TXT

registro é tipo RLD: POS= $02, SIMB= ´DIGIT´, ENDR= $1002, SIZE=4

$1002:$1005 � ($1002:$1005) + $102C (end. final DIGIT)‏

registro é tipo RLD: POS= $14, SIMB= ´MAIN´, ENDR= $1014, SIZE=4

$1014:$1017 � ($1014:$1017) + $1000 (CHAR relativo PGM)‏

registro é tipo END: POS= $00, EXE= $1000, PLA= $101C

10.4 Carregador de ligação direta

Exemplo – cont.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 633

Continuando passo2 para PGM

passo2: PLA= $101C ; EXE= $1000

registro é tipo ESD / SD, assim SCOMP= $0012

registro é tipo ESD / LD, nada faz

registros seguintes são TXT: carrega código na memória

registros (dois) tipo RLD, com os quais as instruções de PGM são atualizadas com referência aos endereços finais de

VALUE e DIGIT

registro é tipo END: neste caso não há dados (EXE= $1000)‏

JUMP para $1000 e inicia processamento.

10.4 Carregador de ligação direta

Exemplo – cont.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 634

000000004E75102C000033C0102A$1020

0000303900004E75101A000013C00030$1010

06005E006D02000A0C00102C00001039$1000

0E0C0A0806040200Posição

posições que sofreram ajuste (relocação ou ligação) de endereço (xxxx)

0000 000E + PGM ($101C) ‏

0000 0000 + DIGIT ($102C)‏

0000 0010 + PGM ($101C) ‏

0000 001A + MAIN ($1000) ‏

LR

RR

10.4 Carregador de ligação direta

Exemplo – cont. (todos os endereços ajustados à direita)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 635

Ao final do passo 2 teremos:

000000004E75102C000033C0102A$1020

0000303900004E75101A000013C00030$1010

06005E006D02000A0C00102C00001039$1000

0E0C0A0806040200Posição

(hexa)

Ao final do passo2 o carregador desvia (JUMP) para $1000.

10.4 Carregador de ligação direta

Exemplo – cont.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 636

10.4 Carregador de ligação direta

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 de carregamento• só o carregador (mais simples) precisa compartilhar a

memória com a aplicação

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 637

10.5 Programas Ligadores

Então, um Programa Ligador, separado do carregador, será usado para criar um módulo de carga, realizando as seguintes tarefas:

•combinar os módulos objeto — com isto o esforço de ligação jáestá realizado;

•manter informação sobre ajustes necessários de relocação;•fazer o código relativo a um único símbolo: endereço inicial de

carregamento.

Exemplo:

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

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 638

10.5 Programas Ligadores

DIGIT

CHAR

VALUE

agora são relocados em relação a um end. inicial

(conforme exemplo em 10.4)‏

Modelo com Programas Ligador e Carregador separados:

segmento

segmento

ligador... ....módulo de carga

carregador

ESD.2E TXT.18.2.4E75 RLD.02.4

TXT.00.6.10390000002C TXT.1A.2.0000 RLD.14.4

TXT.06.4.0C00000A TXT.1C.6.30390000002A RLD.1E.4

TXT.0A.2.6D02 TXT.22.6.33C00000002C RLD.24.4

TXT.0C.2.5E00 TXT.28.2.4E75 END.00

TXT.0E.4.06000030 TXT.2A.2.0000

TXT.12.6.13C00000001A TXT.2C.2.0000

memória

(ver próxima transparência)‏

entradasaída entrada

saída

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 639

10.5 Programas LigadoresConforme exemplo estudado (10.4) – cont.

O programa ligador gera o módulo de carga como a seguir:

• o registro de início do segmento – ESD – indica o tamanho do código de máquina; no caso 2E ou 46 bytes

• o endereço inicial de carga é ipla = 0 (zero); todos os endereços passam a ser relativos a zero, antes da carga

• a saída é gravada em um arquivo para tratamento posterior pelo programa carregador

• a informação de relocação está ao final do módulo de carga (RLD); o endereço inicial de carregamento é a base para todos os ajustes a serem realizados pelo carregador

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 640

10.5 Programas LigadoresConforme exemplo estudado (10.4) – cont.

O programa carregador de posse do módulo de carga atua como a seguir:

• obtém o espaço necessário para a carga do registro ESD

• transfere o código, registros TXT

• realoca conforme os registros RLD

A próxima transparência mostra estes passos.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 641

Carregador

Carregador de

módulo de carga

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 642

10.6 Bibliotecas

• Bibliotecas agrupam módulos de código objeto de uso comum –funções de E/S, matemáticas, etc. - para facilitar a integração ao código da aplicação.

• Biblioteca são arquivos cujo conteúdo é um conjunto de outros arquivos (no caso, módulos objetos) com uma tabela para localizar e

extrair facilmente esses arquivos.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 643

10.6 Bibliotecas (cont.)

Exemplo:

• Bibliotecas estáticas em Unix• criadas e mantidas com o aplicativo ar;

• os 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 -lna linha de comando.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 644

10.6 Bibliotecas (cont.)

Tratamento com o utilitário ar : (cria, mantém e extrai módulos de bibliotecas estáticas no Linux).

• Módulo objeto arqmat.o é criado com > gcc -c arqmat.c

• Este módulo é incluído em libmy.a com > ar –r libmy.a arqmat.o

• libmay.a é a biblioteca estática do usuário;

• –r indica “replacement” caso o módulo já exista na biblioteca

• Outro módulo poderia ser incluído com > ar –r libmy.a convexp.o

• O comando “ar –t libmy.a” permite listar o conteúdo da biblioteca

no caso: arqmat.o e convexp.o

(estáticas) ‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 645

10.6 Bibliotecas (cont.)

Exemplo de estrutura interna típica (campos):

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];

(estáticas) ‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 646

10.7 Carregamento e ligação dinâmicos

Os esquemas básicos apresentados até o momento são estáticos, ou seja:

• ligadores montam o módulo de carga completo antes do carregamento e execução do módulo;

• uma vez definido o endereço para o carregamento, esse não pode ser alterado até o final da execução.

Desvantagem

Em um 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

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 647

10.7 Carregamento e ligação dinâmicos

Princípio: Adiar a definição do valor (endereço) do símbolo

externo até o momento da execução do módulo.

Se um módulo já tiver sido carregado para a memória por uma outra aplicação, o mesmo endereço (ou seja, o mesmo módulo) pode ser utilizado pela aplicação corrente (lembrar código

reentrante).

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 648

10.7 Carregamento e ligação dinâmicos

(módulos objeto para ligação dinâmica) ‏

• código dos módulos deve ser reentrante• basicamente, sem variáveis globais ou estáticas

• códigos mantidos em bibliotecas dinâmicas• sistema Windows: DLL (Dynamic Link Library)• sistema Linux: ELF (arquivos com extensão “so” – shared

objects)‏ (Executable and Linkable Format)

• módulo de carga (o programa executável) é um módulo primário• referências aos módulos externos sem resolução (ver próximatransparência)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 649

10.7 Carregamento e ligação dinâmicos

(estratégias para resolução dinâmica de referências) ‏

1. Referências são resolvidas quando o módulo primário é carregado (tempo de carregamento)‏; (DLL)

ou,

2. Referências são resolvidas quando símbolo éreferenciado (tempo de execução) (ELF) .‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 650

10.7 Carregamento e ligação dinâmicos

1. Referências são resolvidas quando módulo primário é carregado (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 externo já está na memória, o mesmo endereço éutilizado;

• caso contrário, o módulo externo é carregado e seu endereço é definido;

• se algum módulo externo não for localizado, a execução éabortada.

É a solução utilizada no sistema Windows

DLL - Dynamic Link Library

(estratégias para resolução dinâmica de referências) ‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 651

10.7 Carregamento e ligação dinâmicos

• Execução inicia com o módulo de carga primário sem resolução das referências externas;

• apenas quando a referência externa for efetivamente necessária o sistema faz a resolução;

• se módulo já está na memória, o mesmo endereço é utilizado;• caso contrário, o módulo externo é carregado e seu endereço é

definido;• se referência não for utilizada, o módulo externo correspondente nem precisa ser carregado;• eventualmente, a aplicação pode executar sem a instalação da

biblioteca dinâmica correspondente.

É a solução utilizada no sistema LinuxELF - Executable and Linkable Format

2. Referências resolvidas quando símbolo é referenciado (tempo de execução)‏

(estratégias para resolução dinâmica de referências)‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 652

10.7 Carregamento e ligação dinâmicos

Exemplo: carregamento dinâmico da função cos da biblioteca libm.so usando ELF

2. Referências resolvidas quando símbolo é referenciado (tempo de execução)‏

# 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);

}

(estratégias para resolução dinâmica de referências) ‏

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 653

10.7 Carregamento e ligação dinâmicos

Exemplo: carregamento dinâmico da função cos da biblioteca libm.so usando ELF (cont)‏

Lembrando as seguintes funções de 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

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 654

10.7 Carregamento e ligação dinâmicos

Cadeia de dependências: uma 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 da ausência de uma biblioteca dinâmica removida inadvertidamenteou por incompatibilidade de versões.

. problema conhecido como DLL hell, e

. agravado por modificações locais não documentadas e pela ausência de um padrão de numeração de versões.

(problema da dependência de/entre bibliotecas)

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 655

10.7 Carregamento e ligação dinâmicos

Possíveis soluções

• manutenção de um controle de versões, com indicação de major version e minor version;

• atualizações de aplicações controladas por meio de um gerenciador de pacotes.

(problema da dependência de/entre bibliotecas)�

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 656

10.8 Exercícios

1. Qual a diferença entre o resultado gerado por um montador absoluto e um montador de ligação direta?

2. Qual a diferença entre ajuste de relocação e ajuste de ligação?3. Qual a diferença entre ligação dinâmica em tempo de carga e

em tempo de execução?4. Apresente situações nas quais seria interessante que a tabela de

símbolos gerada por um montador fosse incorporada ao módulo objeto gerado.

5. Como se comparam os tamanhos dos módulos objeto nos esquemas de carregamento estático e de carregamento dinâmico?

6. Um montador de ligação direta aplicado a dois arquivos em linguagem simbólica da família 68000 gerou os seguintes módulos objeto:

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 657

10.8 Exercícios (cont.) ‏

END.0000

RLD.000E.04.’MAIN’

RLD.0008.04.’CALC’

RLD.0002.04.’MAIN’

TXT.0014.04.00004E75

TXT.0012.02.4E75

END.TXT.000C.06.33C000000018

TXT.0004.02.4E75TXT.0006.06.4EB900000000

TXT.0002.02.9081TXT.0000.06.203900000014

TXT.0000.02.2200ESD.’RESULT’.’L’.0018.0002

ESD.’CALC’.’S’.0000.0006ESD.’MAIN’.’S’.0000.001A

Passados como argumentos nessa ordem (módulo 1, seguido de módulo 2) para um carregador de ligação direta; obteve-se o endereço inicial de carga (IPLA) $0200.

DCA-FEEC-UNICAMP: Introdução à Computação Digital - julho2011 - Prof. Léo Pini Magalhães 658

10.8 Exercícios (cont.) ‏

(a) Qual o conteúdo da Tabela de Símbolos Externos Globais (GEST) gerada pelo carregador?(b) O diagrama abaixo é um mapa de conteúdo da memória após o carregamento sem os ajustes de ligação e relocação. Indique neste mapa quais posições são ajustadas pelo carregador e qual o novo conteúdo destas posições.

4E759081220000004E7500004E750018021_

000033C0000000004EB9001400002039020_

ECA86420