7. Carregamento Dinâmico

Esta seção é um pouco curta no momento; ela será expandida com o tempo conforme eu estude o Como Fazer ELF

7.1. Conceitos

O Linux tem bibliotecas compartilhadas, como você, neste ponto, deve estar cansado de ouvir, se você leu toda a última seção de uma vez só. Uma parte do trabalho de combinar-nomes-com-lugares que era tradicionalmente feito em tempo de linkagem deve ser postergado para o tempo de carregamento.

7.2. Mensagens de erro

Envie para mim os seus erros de linkagem! Eu não farei qualquer coisa a respeito deles, mas eu poderia escrevê-los ...



can't load library: /lib/libxxx.so, Incompatible version

(Somente a.out) Isto significa que você não tem a versão maior correta da biblioteca xxx. Não, você não pode apenas fazer um link simbólico para outra versão que você tem; se você tem sorte isto irá fazer com que seu programa gere uma falha de segmentação. Obtenha a nova versão. Uma situação similar com ELF irá resultar em uma mensagem como

    ftp: can't load library 'libreadline.so.2'


warning using incompatible library version xxx

(Somente a.out) Você tem uma versão menor mais antiga da biblioteca, do que a pessoa que compilou o programa em uso. O programa ainda irá executar. Provavelmente. Uma atualização não doeria, entretanto.

7.3. Controlando a operação do carregador dinâmico

Existe um grupo de variáveis de ambiente às quais o carregador dinâmico irá responder. A maioria delas é mais útil para ldd do que elas são para o usuário médio, e podem ser definidas de forma mais conveniente executando ldd com várias opções. Elas incluem



7.4. Escrevendo programas com carregamento dinâmico

Isto é muito próximo da maneira que o suporte a carregamento dinâmico do Solaris 2.x trabalha, se você é familiar com aquele. Ele é coberto extensivamente no documento ELF programming de H. J. Lu, e na página de manual do dlopen(3), a qual pode ser encontrada no pacote ld.so. Aqui está um exemplo singelo entretanto: linke-o com -ldl

    #include <dlfcn.h>
    #include <stdio.h>
    
    main()
    {
      void *libc;
      void (*printf_call)();
    
      if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
      {
        printf_call=dlsym(libc,"printf");
        (*printf_call)("hello, world\n");
      }
    
    }