Notas de Aula - MAC 211 - Laboratório de Programação
Aula anterior (aula 9)
Aula 10 - 26/3/2009
Bibliotecas estáticas vs. bibliotecas dinâmicas
- Uma biblioteca é um conjunto de funções/métodos/procedimentos
reutilizáveis e que podem ser ligados a programas para gerar um arquivo
executável.
- Bibliotecas estáticas:
- o compilador acrescenta ao executável final o código das funções da biblioteca que o programa utiliza
- Bibliotecas dinâmicas:
- Conceito inventado pela Sun (verificar) e incorporado no SunOS pela primeira vez na década de 1990.
- as bibliotecas são ligadas ao executável em tempo de execução;
- compilada como código independente de posição PIC (Position Independent Code)
- .dll no Windows, .so no UNIX
- há duas opções
- carga na inicialização: ao carregar o programa, já carrega todas as bibliotecas dinâmicas
- carga preguiçosa: apenas carrega a biblioteca quando ela for necessária (é a mais comum)
- Vantagens de bibliotecas dinâmicas:
- Com bibliotecas estáticas o tamanho do arquivo executável fica bem maior
- Com
bibliotecas estáticas, o código da biblioteca é adicionado ao
executável mesmo que em tempo de execução ele não seja utilizado
- Bibs dinâmicas são compartilhadas entre os vários programas que as usam (tanto na memória quanto no disco)
- Acertos (bug fixes) nas bibliotecas são aproveitados pelos programas antigos
- Menor uso de memória na máquina como um todo (imagine se libc fosse estática)
- É possível acrescentar novas funcionalidades sem mexer no programa principal (p.ex., novos itens num menu)
- Permite você fazer interposição de código
- Vantagens de bibliotecas estáticas:
- Com bibliotecas estáticas, a versão das bibliotecas é fixa, portanto, não há o perigo de incompatibilidade de versões
- Todas as bibliotecas estão dentro do executável portanto não há o risco de não se localizar uma biblioteca em tempo de execução
- Mudanças no comportamento das bibliotecas novas não afetam a corretude dos programas antigos
- busque na Web DLL hell
- A carga de um programa com bibliotecas dinâmicas é mais lenta
- Hoje em dia, bibliotecas dinâmicas é o padrão na maioria dos sistemas
- -shared opção do gcc para gerar bibliotecas dinâmicas
- -static no gcc, força a ligação com bibliotecas estáticas ao
invés de bibliotecas dinâmicas
- Variáveis de ambiente:
- LD_PRELOAD - lista de bibliotecas a serem carregadas antes de todas as outras
- LD_BIND_NOW - faz as bibliotecas dinâmicas serem carregadas de uma vez no início
- LD_LIBRARY_PATH - indica de onde pegar as bibliotecas dinâmicas
- o comando ldd mostra as bibliotecas dinâmicas que serão carregadas para um executável num determinado contexto.
- Mais informações:
Próxima aula (aula 11)
Página de MAC211
Página do Fabio
Página do DCC