Link Dinâmico

De Conecto wiki
Revisão de 14h13min de 27 de novembro de 2015 por 192.168.0.105 (discussão)
Ir para navegação Ir para pesquisar

Links

Um link dinâmico tem como principal objetivo utilizar funções contidas em bibliotecas em tempo de execução, sem a necessidade de incorporar o conteúdo desta ao aplicativo desenvolvido, implicando em uma diminuição de tamanho do arquivo compilado e menos alocação de memória.

Estagios de compilação

A lista das etapas de compilação são[1]:

 - Análise léxica
 - Análise sintática 
 - Análise semântica
 - Geração de código intermediário
 - Optimização de código
 - Geração de código final

A primeira, segunda, e terceira etapas utilizam de algoritmos desenvolvido na sua grande maioria sobre linguagens livre do contexto, de maneira a gerar um código intermediário. Este processo consiste da tradução de instruções em símbolos utilizados pelo mecanismo do compilador. Em seguida, ocorre a otimização do código que trata, entre outras rotinas, de eliminar instruções desnecessárias quando possível. Na geração do código final, as instruções são traduzidas em linguagem de maquina, geralmente Assembly, para que a maquina possa executá-las.

Diferença entre linkedição dinâmica e estática

A diferença entre as duas a diferença básica entre criar um link dinâmico ou estático está na fase da compilação, pois para a linkedição estática, normalmente utilizam-se diretivas de compilação, para sinalizar que deve-se incorporar ao programa final instruções, protótipos de funções e outros detalhes pertinentes a execução de uma função não-nativa ao software. Isto gera crescimento do tamanho do arquivo final e problemas com dependência/incompatibilidade com as bibliotecas. Linkar dinamicamente, na realidade, é definir o endereço das funções da biblioteca que se utiliza, através de um protótipo abstraido para linguagem que está sendo utilizada.

Linkedição dinâmica em C

Abaixo está um exemplo de como linkar dinamicamente uma biblioteca, as funções dlopen e dlsym encontram-se no header dlfcn.h: Admitâmos que deseja-se utilizar uma função com 3 parâmetros cuja seu retorno seja do tipo long.

 int iDynamicLink(){
   void *hLibHandle;
   char *pszLibPath = "/usr/include/liblinking.so";
   long (*LinkedFunct)(int FirstParam, double SecondParam, char *ThirdParam); // Exemplo de funcao generica
   long lResult;
   if ( (hLibHandle = dlopen(pszLibPath, RTLD_LAZY)) == NULL )
     return -1;
   LinkedFunct =
   (long (*)(int FirstParam, double SecondParam, char *ThirdParam))
       dlsym(hLibCliSitef, "LikedFunct");
   // Exemplo de utilizacao
   lResult = LinkedFunction(1, 3.2, "Exemplo");
   return 0;
 }