View
237
Download
0
Category
Preview:
Citation preview
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
Recommended