180 likes | 255 Views
Learn about dynamic libraries usage in Linux and Windows, including linking, loading, and benefits. Understand the differences between static and dynamic linking. Resolve issues like "DLL hell." Enhance your programming skills!
E N D
Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação Software Básico Aula 15: Carregamento dinâmico Silvio Fernandes 2009.1
Introdução • Bibliotecas contém código e dados auxiliares, que provém serviços a programas independentes, o que permite o compartilhamento e a alteração de código e dados de forma modular • Alguns executáveis são tanto programas independentes quanto bibliotecas, mas a maioria das bibliotecas não são executáveis • A maior parte dos SO modernos provê bibliotecas que implementam a maioria dos serviços do sistema
Introdução • Bibliotecas podem ser classificadas • pela maneira como são compartilhadas, • pela maneira como são ligadas • e por quando são ligadas
Ligação dinâmica • Significa que os dados em uma biblioteca não são copiados para um novo executável ou biblioteca em tempo de compilação, mas permanecem em um arquivo separado no disco • O ligador apenas grava quais bibliotecas são necessárias para o executável em um índice • A ligação pode acontecer em tempo de carregamento ou em tempo de execução • Plugins são uma utilização comum de bibliotecas de ligação dinâmica
Carregamento dinâmico • É um subconjunto da ligação dinâmica em que uma biblioteca ligada é carregada ou descarregada do sistema em tempo de execução após requisição • A requisição pode ser feita implicitamente em tempo de compilação, ou explicitamente em tempo de execução • A maioria dos SO que suportam a ligação dinâmica também suportam o carregamento dinâmico através de uma API específica
Bibliotecas dinâmicas no Linux • O Linux oferece suporte a dois tipos de bibliotecas • A biblioteca estática contém funcionalidade ligada, de forma estática, a um programa no momento da compilação • As bibliotecas dinâmicas, que são carregadas quando um aplicativo é carregado e a ligação ocorre no momento da execução
Bibliotecas dinâmicas no Linux • Hierarquia de bibliotecas no Linux
Bibliotecas dinâmicas no Linux • As bibliotecas estáticas podem ser úteis em pequenos programas, que exigem funcionalidade mínima • Para programas que exigem várias bibliotecas, as bibliotecas compartilhadas podem reduzir a área de cobertura de memória do programa • Com uma biblioteca estática, cada programa de execução tem sua própria cópia da biblioteca
Bibliotecas dinâmicas no Linux • GNU/Linux fornece duas formas de lidar com as bibliotecas compartilhadas • É possível vincular dinamicamente seu programa com a biblioteca compartilhada, fazendo com que o Linux carregue a biblioteca na execução • Fazer com que o programa chame funções seletivamente com a biblioteca em um processo chamado carregamento dinâmico • Um programa pode carregar uma biblioteca específica e depois chamar uma determinada função dentro daquela biblioteca
Bibliotecas dinâmicas no Linux • Vínculo estático X dinâmico
Bibliotecas dinâmicas no Linux • A API de Dynamic Loading (DL) existe para o carregamento dinâmico e permite que uma biblioteca compartilhada fique disponível para um programa de espaço de usuário
Bibliotecas dinâmicas no Windows • Dynamic-link library (Biblioteca de ligação dinâmica) ou DLL, é a implementação feita pela Microsoft para o conceito de bibliotecas compartilhadas • Essas bibliotecas geralmente tem as extensões DLL, OCX (para bibliotecas que contêm controles ActiveX), ou DRV (para drivers de sistema legacy)
Bibliotecas dinâmicas no Windows • Os formatos de arquivos para DLL são os mesmos dos arquivos executáveis para Windows • Podem conter códigos , dados, e recursos (ícones, fontes, cursores, entre outros) em qualquer combinação • O propósito original das DLL era economizar espaço em disco e memória necessária para aplicativos, armazenando-as localmente no disco rígido
Bibliotecas dinâmicas no Windows • As DLL proveem os benefícios comuns de bibliotecas compartilhadas, como a modularidade • Uso de interfaces genéricas para plug-ins • Um problema significante, conhecido como "DLL hell" (literalmente, o inferno das DLL), ocorre quando vários aplicativos entram em conflito sobre qual versão de uma biblioteca deve ser utilizada
Bibliotecas dinâmicas no Windows • Cada função exportada por uma DLL é identificada por um numeral ordinal e, opcionalmente, um nome • Esse numeral representa a posição do ponteiro de endereçamento das funções, na Tabela de Endereços de Exportação da DLL
Bibliotecas dinâmicas no Windows • Arquivos DLL podem ser carregados explicitamente em tempo de execução, um processo chamado pela Microsoft como ligação dinâmica em tempo de execução, utilizando a função LoadLibrary (ou LoadLibraryEx) de sua API • Note que com a ligação implícita em tempo de execução, chamada pela Microsoft como ligação dinâmica em tempo de carregamento, se o arquivo DLL não for encontrado, o Windows mostrará uma mensagem de erro e não carregará o aplicativo
Bibliotecas dinâmicas no Windows • O desenvolvedor não tem maneiras de tratar a ausência de arquivos DLL ligados implicitamente pelo linker de tempo de compilação • Por outro lado, com a ligação explícita em tempo de execução, os desenvolvedores tem a oportunidade de criar um tratamento para esse tipo de exceção • A rotina de ligação explícita em tempo de execução é a mesma em qualquer linguagem, pois ela depende da API do Windows e não dos construtores das linguagens
Referências • http://www.ibm.com/developerworks/br/library/l-dynamic-libraries/index.html • http://pt.wikipedia.org/wiki/Biblioteca_(computa%C3%A7%C3%A3o) • http://pt.wikipedia.org/wiki/DLL