Usando dynamic Library no linux :Indice: :Introduçao: Eu criei esse texto para mostrar como poder carregar uma dynamic library (dl) em determinado code seu, e carregar alguma funçao dessa lib em seu code, para poder utilizar. Para começar, voce deve declarar em seu code a seguinte header: dlfcn.h Ela contem os prototpios ads funcs, confs, etc... :Compilaçao: Para compilar os objetos que juntos farao a DL, faz-se isso: gcc code.c -c -fPIC #Isso ira gerar o objeto do code Para gerar a dl com todos os objetos unidos e tals, faz-se isso: gcc o1.o o2.o o3.o -shared -o lib.so Para compilar o executavel que carregara a dl, compila-se assim: gcc code.c -o code -ldl #Voce pode implementar outras chamadas, caso use threads, etc :Carregar e fechar a lib: existe uma funçao que faz o carregamento da dl, ela chama-se dlopen, esta ai o prototipo: void *dlopen(const char *filename, int flag); filename e a localizaçao da lib, tem que colocar a localizaçao completa, ou usar usn macetes como o . e .. flag e o modo de abertura, a que usaremos nesse tutorial e a RTLD_LAZY. [Quem sabe numa reediçao, nao falo sobre as outras flags]. Voce devera ter um handler para puxar a dlopen, ele devera ser do tipo ponteiro void, assim: ... void *handler; ... Exemplo ppratico doque ja fora abordado: ___________________________________________ #include #include #include int main() { void *handler; handler = dlopen("./lib.so", RTLD_LAZY); fprintf(stderr, "A lib foi carregada =D\n"); return(0); } ___________________________________________ Mas voce se perguntaria, nao necessita fechar nao? Necessita ssim, e usa-se a funçao dlclose, com seguinte prototipo: int dlclose(void *handle); Dlclose fecha a lib e pronto, agora para complementar o exemplo pratico, antes do return(0), colocaria-se o dlclose(handler); :Checando erros de carregamento da dl: DLopen retorna 0 quando nao abre direito, assim voce checa o erro dando um if(!handler) ou if(handler == 0) Mas nao esta na err_list os erros de DL, assim, para voce printar o erro, usa-se a funçao dlerror, com seguinte prototipo: char *dlerror(void); Ela retorna o erro na DL, mas nao printa. Agora a implementaçao do exemplo com dlerror: ___________________________________________ #include #include #include int main() { void *handler; handler = dlopen("./lib.so", RTLD_LAZY); if(!handler) { fprintf(stderr, "%s\n", dlerror()); exit(1); } fprintf(stderr, "Lib carregada\n"); dlclose(handler); return(0); } ___________________________________________ Ve-se que agora ele checa por erros, oque ajuda sempre... :Carregando funçoes de uma DL: Agora chega a parte emocionante, em que voce carrega funçoes que estao contidas em determinada lib. A funçao que se encarrega disso chama-se dlsym, que tem o seguinte prototipo: void *dlsym(void *handle, const char *symbol); Aonde ve-se que handle e o handler usado na dlopen, e symbol e a funçao a ser importada. Para poder puxar a funçao, voce deve declarar o pointer assim:] TIPO *(*func)(parametros); TIPO seria algo como void, int, etc, func seria o nome do pointer, voce que escolhe, parametros seriam os parametros da func a ser puxada. Exemplo simples: void *(*func)(void); func = dlsym(handler, "printer"); Pronto, agora carregue o erro printando dlerror, caso esteja tudo ok, execute a func: (*func)(); Agora havera novo exemplo: ## lib.c ## ___________________________________________ #include #include #include int printer(const char *format, ...) { va_list list; int done; va_start(list, format); done = vfprintf(stdout, format, list); va_end(list); return done; } ## lib_exec.c ## ____________________________________________ #include #include #include int main(void) { void *h; char msg[] = "Exemplo de DL"; char *emsg; int *(*printer)(const char *format, ...); if(!(h = dlopen("./lib.so", RTLD_LAZY))) { fprintf(stderr, "%s\n", dlerror()); exit(1); } printer = dlsym(h, "printer"); emsg = dlerror(); if(emsg) { fprintf(stderr, "%s\n", emsg); exit(1); } (*printer)("%s\n", msg); dlclose(h); return 0; } ____________________________________________ Compile assim: gcc lib.c -c -fPIC gcc lib.o -shared -o lib.so gcc lib_exec.c -o lib_exec -dl Execute e veja como e... :Finalizaçao: Espero que tenham gostado desse texto, pois eu tive de pesquisar bastante para aprender isso, e principalmente para poder criar esse tutorial... :Contato: morte137@gmail.com morte137@linuxmail.org :Bibliografia: Manual da dlfcn.h no linux, e os tutoriais que vem junto do conjunto de tutos Multi-Threaded Programming with POSIX Threads - Linux Systems Programming