carregadores de programasmarco/cursos/ea876_06_1/carregadores/... · um montador ou compilador....

45
Carregadores de Programas Departamento de Engenharia de Computa¸ ao e Automa¸ ao Industrial Faculdade de Engenharia El´ etrica e de Computa¸ ao Universidade Estadual de Campinas 04/2006 Marco A. A. Henriques

Upload: vandan

Post on 03-Dec-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

Carregadores de Programas

Departamento de Engenharia deComputacao e Automacao Industrial

Faculdade de Engenharia Eletricae de Computacao

Universidade Estadual de Campinas

04/2006 Marco A. A. Henriques

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Programas

Finalidade

Preparar e carregar em posicoes adequadas dememoria os segmentos de codigo-objeto gerados porum montador ou compilador.

ProgramaFonte 1

Montador

MontadorProgramaFonte 2

Programa

Programa

Objeto 1

Objeto 2

Carregador Programa pronto

para execucao

Carregador

Montador

Memoria

04/2006 Marco A. A. Henriques 1

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Programas

Tarefas Basicas

Alocacao: reserva de espaco em memoria.

Carregamento: copia dos segmentos de codigo-objeto para memoria reservada.

Ligacao: resolucao das referencias simbolicas cruza-das entre codigos-objeto.

Relocacao: ajuste dos valores de enderecos paraadequa-los aos enderecos reais do espaco reser-vado.

Novo end. =antigo end. + (nova origem - velha origem)

04/2006 Marco A. A. Henriques 2

Carregadores de Programas DCA/FEEC/UNICAMP

Exemplo

Codigos-objeto gerados e agrupados em 4 seg-mentos (DADOS 1, PROG 1, DADOS 2, PROG 2)por um montador a partir dos programas-fonte<Programa A> e <Programa B>:

Programa A

LC Cod.-objeto Mnemonicos

0000 EXTERNAL DECIMAL

0000 DADOS 1 EQU $6001

0000 PROGRAMA EQU $4000

0000 ORG DADOS 1

6001 0000 HEXA DS.W 1

6003 ORG PROGRAMA

4000 1038 ???? PROG 1 MOVE.B DECIMAL,D0

4004 0C00 000A CMPI.B #10,D0

4008 6D02 BLT.S SOMA

400A 5E00 ADDQ.B #’A’-10 -’0’,D0

400C 0600 0030 SOMA ADDI.B #’0’,D0

4010 11C0 6001 MOVE.B D0,HEXA

4014 4E75 RTS

4016 END PROG 1

04/2006 Marco A. A. Henriques 3

Carregadores de Programas DCA/FEEC/UNICAMP

Exemplo (cont.)

Programa B

LC Cod.-objeto Mnemonicos

0000 ENTRY DECIMAL

0000 DADOS 2 EQU $5000

0000 PROGRAMA EQU $3000

0000 ORG DADOS 2

5000 0000 VALOR DS.W 1

5002 0000 DECIMAL DS.W 1

5002 ORG PROGRAMA

3000 3038 5000 PROG 2 MOVE.W VALOR,D0

3004 31C0 5002 MOVE.W D0,DECIMAL

3008 4E75 RTS

300A END PROG 2

04/2006 Marco A. A. Henriques 4

Carregadores de Programas DCA/FEEC/UNICAMP

Observacoes

• 2 pseudo-instrucoes usadas para declarar e refe-renciar os sımbolos externos:

ENTRY: permite especificar rotulos de um pro-grama que serao referenciados por outros pro-gramas.

EXTERNAL: permite utilizar referencias defini-das em outros programas.

• O conteudo do endereco $4002 nao pode serresolvido durante a montagem.

04/2006 Marco A. A. Henriques 5

Carregadores de Programas DCA/FEEC/UNICAMP

Observacoes (cont.)

• Se os segmentos <DADOS 1>, <PROG 1>,<DADOS 2> e <PROG 2> forem carregados,respectivamente, nos enderecos $9001, $7000,$6000 e $5000, o carregador deve atualizar osenderecos correspondentes a cada rotulo.

Endereco de Codigo-memoria objeto

9001 00007000 1038 60027004 0C00 000A7008 6D02700A 5E00700C 0600 00307010 11C0 90017014 4E756000 00006002 00005000 3038 60005004 31C0 60025008 4E75

04/2006 Marco A. A. Henriques 6

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Programas

Tipos de Carregadores

Codigos-objetonao-relocaveis

Codigos-objeto relocaveis

Codigos-objeto com dados e subrotinas comuns

Codigos-objeto com subrotinas

Codigos-objeto nao-relocaveis

Programas Fonte

ProgramaExecutavel

MontadorCarregadorAbsoluto

Carregador de Ligacao Direta

Ligador Carregador

"Load - and - Go"

Carregador baseadoem Vetor de Transf.

04/2006 Marco A. A. Henriques 7

Carregadores de Programas DCA/FEEC/UNICAMP

Montadores Load-and-Go

• Instrucoes de maquina ou dados, sao carregadosna memoria a medida que um montador load-and-go traduz os mnemonicos.

• Funcao do carregador e somente iniciar aexecucao.

• Carregador so recebe como entrada a origem dosegmento principal.

04/2006 Marco A. A. Henriques 8

Carregadores de Programas DCA/FEEC/UNICAMP

Montadores Load-and-Go

Exemplo

Programa pronto

para execucao

Montador

"load-and-go" MontadorPrograma

Fonte

Memoria

04/2006 Marco A. A. Henriques 9

Carregadores de Programas DCA/FEEC/UNICAMP

Montadores Load-and-Go

Conclusoes

Vantagem :

• Simplicidade

Desvantagens :

• Coexistencia de instrucoes executaveis do pro-grama e do montador na memoria principal:requer mais espaco de memoria.

• Necessidade de refazer a montagem toda vezque se executa o programa.

• Dificuldade de ligar programas escritos em di-ferentes linguagens.

• Necessidade de resolver problemas de ligacao,alocacao e relocacao manualmente.

04/2006 Marco A. A. Henriques 10

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores Absolutos

Recebem como entrada os segmentos de codigos-objeto gerados por um montador e os colocam nasposicoes de memoria determinadas por LC.

Exemplo

4600

460C

5000

5012 6000 6002

MAIN

FACTOR

CarregadorAbsoluto

Carregador

DATA

Objeto 1

Objeto 2

Codigo

Codigo

Memoria

04/2006 Marco A. A. Henriques 11

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores Absolutos

Conclusoes

Vantagens :

• Montagem e carregamento ocorrem separada-mente, nao ocupando simultaneamente espacosda memoria.

• Montagem so e necessaria quando programas-fonte sao modificados.

• O desenvolvimento de programas-fonte em lin-guagens diferentes e facilitado.

Desvantagens :

• Necessidade de resolver manualmente ligacoesentre segmentos.

• Necessidade de especificar na memoria a origemprecisa de cada segmento de instrucoes e dedados.

04/2006 Marco A. A. Henriques 12

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores com Relocacao

Carregam programas interdependentes, mas mon-tados separadamente.

Usos tıpicos:

• chamadas as subrotinas nao definidas no mesmomodulo de programas

• compartilhamento de area comum de dados pordiferentes modulos de programas

Tipos:

• Carregadores Baseados em Vetor de Transferencia(obsoletos)

• Carregadores de Ligacao Direta

• Carregadores Dinamicos

04/2006 Marco A. A. Henriques 13

Carregadores de Programas DCA/FEEC/UNICAMP

Exemplo

LC Codigos Mnemo-Objeto nicos

0000 DADOS EQU $6000

0000 PROGRAMA EQU $4600

0000 EXTERNAL FACTOR

0000 ORG DADOS

6000 0000 NUMB DS.W 1

6002 0000 F_NUMB DS.W 1

6004 ORG PROGRAMA

4600 3038 6000 MAIN MOVE.W NUMB,D0

4604 4EB8 ???? JSR FACTOR

4608 31C0 6002 MOVE.W D0,F_NUMB

460C 4E75 RTS

460E END MAIN

04/2006 Marco A. A. Henriques 14

Carregadores de Programas DCA/FEEC/UNICAMP

Exemplo (cont.)

LC Codigos Mnemo-Objeto nicos

0000 PROGRAMA2 EQU $5000

0000 ENTRY FACTOR

0000 ORG PROGRAMA2

5000 4E50 FFFE FACTOR LINK A0,#-2

5004 3140 FFFE MOVE.W D0,-2(A0)

5008 5340 SUBQ.W #1,D0

500A 6604 BNE.S F_CONT

500C 7001 MOVEQ #1,D0

500E 6006 BRA.S RETURN

5010 61EE F_CONT BSR FACTOR

5012 COE8 FFFE MULU -2(A0),D0

5016 4E58 RETURN UNLK A0

5018 4E75 RTS

5018 END FACTOR

04/2006 Marco A. A. Henriques 15

Carregadores de Programas DCA/FEEC/UNICAMP

Carregador de Ligacao Direta

• Tipo de carregador mais flexıvel.

• Permite a definir e montar separadamente qual-quer numero de segmentos de instrucoes e dedados interdependentes.

04/2006 Marco A. A. Henriques 16

Carregadores de Programas DCA/FEEC/UNICAMP

Carregador de Ligacao Direta

Dados de Entrada

Para cada segmento:

• Codigo-objeto.

• Comprimento do codigo.

• Lista de sımbolos referenciaveis por outros seg-mentos e seu endereco relativo.

• Lista de sımbolos usados mas nao definidos noescopo do segmento.

• Lista de posicoes com conteudos relocaveis ea indicacao de como reloca-los.

• Endereco de entrada do segmento principal.

04/2006 Marco A. A. Henriques 17

Carregadores de Programas DCA/FEEC/UNICAMP

Carregador de Ligacao Direta

Blocos de Entrada

Dados de entrada sao agrupados em quatro blo-cos:

TXT : contem codigos-objeto.

ESD (External Symbol Dictionary): contem ossımbolos referenciaveis externamente (SD - Seg-ment Definition e LD - Local Definition) ou queserao definidos externamente (ER -External Re-ference).

RLD (Relocation and Linkage Directory): conteminformacao sobre os enderecos cujos conteudossao relocaveis.

END : especifica o fim do conjunto de um segmentoe, se for segmento principal, o endereco de inıciode execucao.

04/2006 Marco A. A. Henriques 18

Carregadores de Programas DCA/FEEC/UNICAMP

Carregador de Ligacao Direta

Exemplo

Blocos de entrada para carregador vindos damontagem dos programas-fonte <Programa A> e<Programa B>.

Programa A

Bloco TXT: duas primeiras colunas abaixo.

LC Cod. objeto Mnemonicos

00 EXTERNAL DECIMAL

00 1038 PROG 1 MOVE.B DECIMAL,D0

02 0000

04 0C00 CMPI.B #10,D0

06 000A

08 6D02 BLT.S SOMA

0A 5E00 ADDQ.B #’A’-10 -’0’,D0

0C 0600 SOMA ADDI.B #’0’,D0

0E 0030

10 11C0 MOVE.B D0,HEXA

12 0016

14 4E75 RTS

16 0000 HEXA DS.W 1

18 END PROG 1

04/2006 Marco A. A. Henriques 19

Carregadores de Programas DCA/FEEC/UNICAMP

Carregador de Ligacao Direta

Exemplo (cont.)

Bloco ESD:

Sımbolo Tipo Endereco Comprimento ID

Relativo

PROG 1 SD 00 24 bytes 1

DECIMAL ER 2

Bloco RLD:

Posicao relativa Comprimento Ajuste ESD ID (refer.)

02 2 bytes + 2

12 2 bytes + 1

Bloco END: $00 (endereco relativo do inıcio dosegmento principal).

END $00

04/2006 Marco A. A. Henriques 20

Carregadores de Programas DCA/FEEC/UNICAMP

Carregador de Ligacao Direta

Exemplo (cont.)

Programa B

Bloco TXT: duas primeiras colunas abaixo.

LC Cod. objeto Mnemonicos

00 ENTRY DECIMAL00 3038 PROG 2 MOVE.W VALOR,D0

02 000A04 31C0 MOVE.W D0,DECIMAL

06 000C08 4E75 RTS

0A 0000 VALOR DS.W 10C 0000 DECIMAL DS.W 10E END

Bloco ESD:

Sımbolo Tipo Endereco Comprimento IDRelativo

PROG 2 SD 00 14 bytes 1DECIMAL LD 0C – –

Bloco RLD:

Posicao relativa Comprimento Ajuste ESD ID (refer.)

02 2 bytes + 106 2 bytes + 1

04/2006 Marco A. A. Henriques 21

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Estrutura de Dados Geradas

IPLA (Initial Program Load Address): endereco deinıcio de carregamento de um conjunto de codigosfornecido pelo programador ou sistema operacio-nal.

PLA (Program Load Address Counter): contadorpara seguir enderecos atribuıdos a cada segmento.

GEST (Global External Symbol Table): tabela con-tendo todos os sımbolos externos com respectivosenderecos na memoria.

LESA (Local External Symbol Array): e o vetorque estabelece a correspondencia entre os identifi-cadores, utilizados em ESD e RLD, e os enderecosabsolutos dos sımbolos externos.

04/2006 Marco A. A. Henriques 22

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Processo de Carregamento: Passo 1

Objetivo: atribuir um endereco a cada segmentoe associar a cada sımbolo do GEST um enderecoabsoluto.

• Alocar espaco suficiente para todos os segmentos.

• Obter endereco inicial de carga (IPLA).

• Atualizar contador de posicoes absolutas namemoria (PLA).

• Guardar enderecos equivalentes a sımbolos exter-nos na tabela GEST.

04/2006 Marco A. A. Henriques 23

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Fluxograma do Passo 1

Ler proximo arquivo

Tipo de Simbolo?

variavel SCOMP

posicao relativa no segmento

Insereir o simbolo com VALOR na GEST

VALOR = PLA

VALOR = PLA +

ERRO !

Ir paraTXT ou RLD

END

ESD

ER

SD LD

armazena’-lo na

Simbolo no GEST?

Palavra-chave da linha

Ler uma linha

PLA = IPLA

do arquivo

S

N

Ler o comprimento

Nao ha’

Obter enderecoinicial IPLA

PLA = PLA + SCOMP

do segmento e

PASSO 2

04/2006 Marco A. A. Henriques 24

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Exemplo (cont.)

Estruturas de dados apos Passo 1

A seguinte tabela GEST e gerada, supondo queum espaco contıguo de memoria com IPLA = $4000tenha sido alocado.

Sımbolos EnderecoExternos na MemoriaPROG 1 4000PROG 2 4018DECIMAL 4024

04/2006 Marco A. A. Henriques 25

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Processo de Carregamento: Passo 2

Objetivo: carregar codigos-objeto na memoria,ajustar enderecos e transferir controle para programacarregado.

• Construir vetor de sımbolos externos locais(LESA) para cada segmento, utilizando GEST.

• Transferir codigos para memoria.

• Ajustar enderecos, utilizando RLD e LESA.

• Transferir controle para programa carregado, indi-cando endereco de sua primeira instrucao (END).

04/2006 Marco A. A. Henriques 26

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Fluxograma do Passo 2

Ler proximo arquivo

da linha

Tipo de Simbolo?

PLA = IPLAEXE = IPLA

Buscar ID do simbolono campo ID do RLD

o valor do simboloPesquisar na GEST

Palavra-chave

ENDESD RLD

TXT

LD

SD ER

em branco Endereco E

EXE = PLA + E

Ler uma linhado arquivo

PC = EXE;Executar

com/do conteudo em

Baseado em AJUSTEsomar/subt. VALOR

PLA+posicao relativa simbolo;LESA[ID] = VALOR;

Ler ID associado ao

LESA[ID] = PLA; simbolo;Ler ID associado ao

Ler o comprimentodo segmento e

variavel SCOMParmazena-lo na

para PLA+POS;

Ler a posicao relativa POS;

Buscar VALOR em LESA[ID]

?N

S

(VALOR)

Copiar codigo

PLA = PLA + SCOMP

Nao ha’

04/2006 Marco A. A. Henriques 27

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Exemplo (cont.)

Durante o Passo 2:

PROG 1: vetor LESA

ID endereco em Hex.01 400002 4024

PROG 1: enderecos relocados

Posicao Novo endereco02 LESA[02]+0000 = 402412 LESA[01]+0016 = 4016

PROG 2: vetor LESA

ID endereco01 4018

PROG 2: enderecos relocados

Posicao Novo endereco02 LESA[01]+000A = 402206 LESA[01]+000C = 4024

04/2006 Marco A. A. Henriques 28

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Exemplo (cont.)

Codigos carregados apos o Passo 2:

Endereco Codigos4000 1038 40244004 0C00 000A4008 6D02400A 5E00400C 0600 00304010 11C0 40164014 4E754016 00004018 3038 4022401C 31C0 40244020 4E754022 00004024 0000

04/2006 Marco A. A. Henriques 29

Carregadores de Programas DCA/FEEC/UNICAMP

Carregadores de Ligacao Direta

Conclusoes

Vantagens :

• Flexibilidade• Modularidade

Desvantagens :

• Repeticao dos procedimentos de alocacao,ligacao, relocacao e carregamento a cadaexecucao do programa.

• Necessidade de coexistencia na memoria de umcarregador complexo (grande) e do programasendo carregado.

04/2006 Marco A. A. Henriques 30

Carregadores de Programas DCA/FEEC/UNICAMP

Ligadores + Carregadores

• Quatro funcoes (alocacao, ligacao, relocacao ecarregamento) sao divididas entre dois programaspara aumentar a flexibilidade:

Programa Ligador (Linker) : estabelece elos deligacao entre os segmentos, resolvendo as re-ferencias pendentes.

Programa Carregador (Loader) : carregacodigo executavel.

• As funcoes de alocar memoria e relocar enderecospodem estar contidas em qualquer um dos doisprogramas acima.

04/2006 Marco A. A. Henriques 31

Carregadores de Programas DCA/FEEC/UNICAMP

Ligadores + Carregadores

Tipos de Ligadores

• Ligador de imagem de memoria (core imagebuilder)

– Gera codigo-objeto (modulo de carga) prontopara ser executado (modulo a imagem damemoria).

– Carregador (module loader): so precisa carre-gar modulo de carga na memoria.

– E a combinacao ligador/carregador mais sim-ples e rapida.

• Editor de ligacao (linkage editor)

– Gera codigo-objeto que pode ser relocado ecarregado em qualquer parte da memoria.

– Carregador precisa alocar memoria e relocarenderecos alem de carregar o modulo.

– E uma combinacao ligador/carregador maiscomplexa, mas mais flexıvel.

04/2006 Marco A. A. Henriques 32

Carregadores de Programas DCA/FEEC/UNICAMP

Editor de Ligacao

Diferencas em relacao ao carregador de ligacaodireta:

• o registro de inıcio de segmento indica o tamanhototal do codigo de maquina;

• o endereco inicial de carga (IPLA) e consideradozero;

• a saıda e gravada em um arquivo (modulo decarga) e nao carregada diretamente na memoria.Obs: as informacoes de relocacao precisam serpreservadas.

Exemplo de editor de ligacao: programa ld do Unix.

• Combina varios arquivos-objeto isolados ou queestao em bibliotecas, reloca seus dados e resolvereferencias simbolicas.

• Normalmente e chamado pelo compilador abertogcc.

04/2006 Marco A. A. Henriques 33

Carregadores de Programas DCA/FEEC/UNICAMP

Bibliotecas

Alguns programas sao tao basicos e comuns queacabam sendo disponibilizados ja prontos na formade codigo-objeto para os programadores.

• Devido ao grande numero, estes programas naosao disponibilizados na forma de um programa porarquivo.

• Os programas que tem funcionalidades em comumsao agrupados em bibliotecas de dois tipos:

– bibliotecas estaticas– bibliotecas dinamicas

04/2006 Marco A. A. Henriques 34

Carregadores de Programas DCA/FEEC/UNICAMP

Bibliotecas Estaticas

Fornecem o codigo-objeto a ser integrado aoprograma principal antes da execucao (na fase deligacao).

• Modulos objetos sao criados por um compilador(gcc, por exemplo).

• Bibliotecas estaticas sao criadas e mantidas porgcc ou por ferramentas proprias (como ar, porexemplo).

04/2006 Marco A. A. Henriques 35

Carregadores de Programas DCA/FEEC/UNICAMP

Bibliotecas Estaticas - Exemplo

Criacao de uma biblioteca estatica (libminha.a) einclusao de um modulo-objeto (meu-codigo.o).

> gcc -c meu-codigo.c (Obs: -c denota nao ligar.)

> ar -r libminha.a meu-codigo.o (Obs: -r denotareplace.)

> ar -t libminha.a (Obs: -t denota listar.)

outro-codigo.o (Obs: codigo previamente exis-tente em libminha.a.)

meu-codigo.o (Obs: codigo recem-inserido.)

04/2006 Marco A. A. Henriques 36

Carregadores de Programas DCA/FEEC/UNICAMP

Uso de bibliotecas estaticas

Bibliotecas muito comuns nao precisam ser expli-citadas para o compilador e sao incluıdas no processode ligacao automaticamente.

Ex: libc.a contem funcoes muito comuns dalinguagem C (como printf, por exemplo) e nao precisaser indicada. O compilador busca por ela em /usr/lib(no caso de Unix).

Se a biblioteca nao tiver funcoes de uso taofrequente (funcoes matematicas, por exemplo), elanao sera incluıda automaticamente no processo deligacao e precisara de uma indicacao explıcita.

04/2006 Marco A. A. Henriques 37

Carregadores de Programas DCA/FEEC/UNICAMP

Exemplo de uso de biblioteca estatica

Se o programa usa funcoes matematicas comosin(x), e preciso compila-lo e liga-lo com libm.a:

> gcc calculo.c -lm (Obs: na chave -l so se usaa parte do nome apos lib .

Se for preciso usar a biblioteca libminha.a queesta em /home/marco :

> gcc calculo.c -lminha -L /home/marco

(Obs: a chave -L indica diretorios nao padraopara busca de bibliotecas.)

04/2006 Marco A. A. Henriques 38

Carregadores de Programas DCA/FEEC/UNICAMP

Ligadores + Carregadores

Ligacoes Dinamicas

• Ligacao e carregamento sao postergados ate omomento da execucao do programa.

• Programas podem ser retirados total ou parcial-mente da memoria (enquanto estao sendo exe-cutados) e recarregados mais tarde em outrasposicoes, exigindo uma nova ligacao.

• Vantagens:

– Somente os modulos realmente necessariosserao ligados e carregados: rapidez no carrega-mento e economia de memoria.

– Permite usar nomes de sub-rotinas comoparametros de entrada de programas.

• Desvantagens:

– esquema mais complexo– programa pode ter execucao mais lenta

04/2006 Marco A. A. Henriques 39

Carregadores de Programas DCA/FEEC/UNICAMP

Tipos de ligacao dinamica

• Ligacao dinamica em tempo de carregamento(load time): modulo de carga primario do pro-grama e carregado inicialmente na memoria e emseguida os modulos que forem referenciados pelomodulo primario sao carregados e os enderecosajustados.

• Ligacao dinamica em tempo de execucao (runtime): carregamento e resolucao de enderecos deum modulo externo sao postergados ate que umainstrucao deste modulo precise ser executada.

04/2006 Marco A. A. Henriques 40

Carregadores de Programas DCA/FEEC/UNICAMP

Formatos e bibliotecas para ligacao

dinamica

Formato ELF (Executable and Linking Format):

• esta se tornando o formato binario default emsistemas Unix;

• suporta ligacao dinamica, carregamento dinamico,controle de tempo de execucao, criacao de biblio-tecas dinamicas;

• possui tres tipos de arquivos:

– executavel: fornece as informacoes necessariasao sistema operacional para executar o pro-grama (extensao .elf);

– relocavel: tem informacoes sobre como o ar-quivo deve ser ligado com outros arquivos ob-jeto (extensao .o);

– objeto compartilhado: contem informacoes ne-cessarias para ligacoes estaticas e dinamicas,constituindo uma biblioteca compartilhada (ex-tensao .so em Unix e .dll em Windows).

04/2006 Marco A. A. Henriques 41

Carregadores de Programas DCA/FEEC/UNICAMP

Bibliotecas Dinamicas - Exemplo

Criacao de uma biblioteca dinamica (libminha.so)e inclusao de um modulo-objeto (meu-codigo.o).

• Criacao do modulo-objeto:> gcc -fPIC meu-codigo.c (Obs: -fPIC denotaposition independent code.)

• Criacao da biblioteca e insercao do modulo-objeto:> gcc -shared -o libminha.so meu-codigo.o

Observacoes:

• o parametro -shared informa que o arquivo indi-cado pela chave -o e uma biblioteca compartilhada

cujos modulos podem ser carregados e ligados di-namicamente;

• o compilador gcc tambem pode gerar bibliotecasestaticas com a opcao -static.

04/2006 Marco A. A. Henriques 42

Carregadores de Programas DCA/FEEC/UNICAMP

Uso de bibliotecas dinamicas

O formato ELF possui uma API (Application

Program Interface) para manipular funcoes em bibli-otecas dinamicas.

• Para abrir (dar acesso) a biblioteca:

void * dlopen (const char *filename, int flag);

• Para obter o endereco de uma variavel ou funcao:

const void * dlsym (void *handle, const char *symbol);

• Para fechar a biblioteca e liberar memoria:

int dlclose (void *handle);

• Para obter uma string com diagnostico do errogerado:

const char * dlerror (void);

04/2006 Marco A. A. Henriques 43

Carregadores de Programas DCA/FEEC/UNICAMP

Exemplo de uso de biblioteca dinamica

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

if (!handle) {

fputs (dlerror(),stderr);

return 1;

}

cosine = dlsym(handle, "cos");

if ((error = dlerror()) != 0) {

fputs(error, stderr);

return 1;

}

printf("%f\n", (*cosine)(2.0));

dlclose(handle);

}

04/2006 Marco A. A. Henriques 44