#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:
o primeiro parâmetro será o nome da DL que deverá ser carregada pela aplicação: minhalib.so
;
o segundo e o terceiro parâmetros serão inteiros com sinal de 32 bits;
o quarto parâmetro será um número racional (double).
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:
int imprime(void)
, que imprime mensagem em stdout
terminada em \n
,
int calcula(int, int)
e
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:
caso a DL informada em linha de comando não exista, a aplicação deverá informar mensagem em linha única de stdout
;
para cada serviço a ser consumido com sucesso, o valor de retorno (int
) deverá ser informado em linha separada;
caso o serviço não tenha sido implementado, a aplicação informará mensagem em linha separada.
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.
A saída é a impressão dos retornos dos serviços da DL ou mensagem de erro/aviso, cada um impresso em linha separada.
$ ./meu_programa naoexiste.exe 10 33 3.14
nao disponivel
$ ./meu_programa ./minhalib.so 10 33 3.14
uau!
0
43
0
$ ./meu_programa ./outralib.so 10 33 3.14
nao implementado
23
-1
$ ./meu_programa ./maisoutralib.so 10 33 3.14
ola!
57
não implementado
3
$ ./meu_programa ./maisumalib.so 10 33 3.14
ola!
57
-77
nao implementado