Carga dinâmica de bibliotecas: #include <dlfcn.h>

Bibliotecas dinâmicas (DL) são bibliotecas que são carregadas em um momento distinto daquele da inicialização de uma aplicação/processo. Elas são particulamente úteis na implementação de módulos funcionais, pois permitem carregar o módulo apenas no momento em que ele será realmente necessário para execução da aplicação.

No sistema Linux, bibliotecas DL não se diferenciam em relação a aplicações em formato binário; elas costumam ser construídas como object files padrão ou standard shared libraries. A grande diferença para as demais aplicações consiste no fato de que as bibliotecas não são automaticamente carregadas na ligação ou na inicialização de uma aplicação; na verdade, há uma API para a abertura de uma biblioteca, busca por símbolos, tratamento de erros e fechamento da biblioteca. Os usuários da linguagem C precisam usar os serviços do header <dlfcn.h> para demandar os serviços dessa API.

O serviço similar em ambientes Windows é provido pelas DLLs.

Neste exercício, você deverá criar uma aplicação capaz de receber três parâmetros em linha de comando:

Um exemplo típico de linha de comando pode ser encontrado abaixo:

$ ./meu_programa ./minhalib.so 10 33 3.14

A partir dos parâmetros recebidos, sua aplicação deverá carregar dinamicamente a DL informada e tentará consumir serviços dessa DL na ordem abaixo:

  1. int imprime(void), que imprime mensagem em stdout terminada em \n,

  2. int calcula(int, int) e

  3. int trigo(double, *double).

Observe que cada um dos serviços realiza uma atividade e sempre retorna um inteiro (int).

A aplicação deverá responder da seguinte forma:

Entrada

A entrada é uma chamada de linha de comando para a execução da aplicação, chamada na qual são informados os parâmetros de linha de comando.

Saída

A saída é a impressão dos retornos dos serviços da DL ou mensagem de erro/aviso, cada um impresso em linha separada.

Exemplo de Entrada

$ ./meu_programa naoexiste.exe 10 33 3.14

Exemplo de Saída

nao disponivel

Exemplo de Entrada

$ ./meu_programa ./minhalib.so 10 33 3.14

Exemplo de Saída

uau!
0
43
0

Exemplo de Entrada

$ ./meu_programa ./outralib.so 10 33 3.14

Exemplo de Saída

nao implementado
23
-1

Exemplo de Entrada

$ ./meu_programa ./maisoutralib.so 10 33 3.14

Exemplo de Saída

ola!
57
não implementado
3

Exemplo de Entrada

$ ./meu_programa ./maisumalib.so 10 33 3.14

Exemplo de Saída

ola!
57
-77
nao implementado