.\" -*- nroff -*- .\" Copyright 1995 Yggdrasil Computing, Incorporated. .\" written by Adam J. Richter (adam@yggdrasil.com), .\" with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com). .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, write to the Free .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, .\" USA. .\" .TH DLOPEN 3 "16 May 1995" "Linux" "Linux Programmer's Manual" .SH NOME dlclose, dlerror, dlopen, dlsym \- Interface de programação do carregador de bibliotecas dinâmicas. .SH SINOPSE .B #include .sp .BI "void *dlopen (const char *" "filename" ", int " flag "); .br .BI "const char *dlerror(void);" .br .BI "void *dlsym(void *"handle ", char *"symbol "); .br .BI "int dlclose (void *"handle "); .sp Special symbols: .BR "_init" ", " "_fini" ". " .SH DESCRIÇÃO .B dlopen Carrega uma biblioteca dinâmica do arquivo designado pela string .I filename e retorna um "handle" para a biblioteca. Se .I filename não for um path absoluto (não começar com "/"), o arquivo será procurado nos seguintes locais: .RS .PP Uma lista de diretórios separados por ponto-e-vírgula na variável de ambiente \fBLD_LIBRARY_PATH\fP .PP A lista de bibliotecas em \fI/etc/ld.so.cache\fP. .PP \fI/usr/lib\fP e \fI/lib\fP. .RE .PP Se .I filename for NULL, o handle designará o programa principal. .PP As referências externas da biblioteca são definidas usando as bibliotecas na lista de dependências desta biblioteca ou de quaisquer outras bibliotecas abertas como flag .B RTLD_GLOBAL . Se o executável foi linkado com o flag "-rdynamic", os símbolos globais no executável também serão usados para definir referências numa biblioteca carregada dinamicamente. .PP .I flag pode ser .BR RTLD_LAZY , que faz que os símbolos não definidos sejam pesquisados durante a execução, ou .BR RTLD_NOW , que faz que todos os símbolos não definidos sejam pesquisados antes que .B dlopen retorne, e falhe se não puder fazê-lo. A opção .B RTLD_GLOBAL pode ser acrescentada (com OR) a .IR flag, o que faz com que os símbolos externos definidos na biblioteca sejam disponibilizados para as bibliotecas carregadas posteriormente. .PP Se a biblioteca exportar uma rotina chamada .BR _init , este código será executado antes do retorno de dlopen. Se uma mesma biblioteca for carregada duas vezes, será retornado o mesmo handle. A biblioteca dl mantém uma contagem de links, e a biblioteca não será dealocada até que .B dlclose seja chamada o mesmo número de vezes que .B dlopen tenha sido usada com sucesso. .PP Se .B dlopen falhar por qualquer motivo, ela retornará NULL. Uma mensagem de texto descrevendo o erro mais recente gerado pelas funções dlopen, dlsym ou dlclose pode ser obtida com .BR dlerror() . .B dlerror retorna NULL se não tiver ocorrido nenhum erro desde a inicialização ou desde que ela foi chamada pela última vez. Chamar .B dlerror() duas vezes seguidas sempre fará com que a segunda chamada retorne NULL. .B dlsym pega o handle de uma biblioteca e o noe do símbolo e retorna o endereço onde este símbolo se encontra. Se o símbolo não for encontrado, retorna NULL. O modo certo de identificar um erro do .B dlsym é gravar o resultado de .B dlerror em uma variável e ver se o resultado é NULL. Isto ocorre porque o valor do símbolo pode ser NULL. Também é necessário armazenar o resultado de .B dlerror em uma variável porque, se esta função for chamada novamente, ela retornará NULL. .PP .B dlclose decrementa a contagem do handle da biblioteca dinâmica. Se esta contagem chegar a zero e não houver outra biblioteca usando símbolos desta biblioteca, ela é descarregada. Se houver uma rotina chamada .BR _fini , ela será executada imediatamente antes de a biblioteca ser descarregada. .SH EXEMPLOS .B Carregar a biblioteca de matemática e calcular o coseno de 2.0: .RS .nf .if t .ft CW #include int main(int argc, char **argv) { void *handle = dlopen ("/lib/libm.so", RTLD_LAZY); double (*cosine)(double) = dlsym(handle, "cos"); printf ("%f\\n", (*cosine)(2.0)); dlclose(handle); } .if t .ft P .fi .PP Se este programa estivesse num arquivo chamado "foo.c", o programa seria compilado com o comando .RS .LP gcc -rdynamic -o foo foo.c -ldl .RE .RE .LP .B Idem, mas fazendo checagem de erros a cada passo: .RS .nf .if t .ft CW #include #include int main(int argc, char **argv) { void *handle; double (*cosine)(double); char *error; handle = dlopen ("/lib/libm.so", RTLD_LAZY); if (!handle) { fputs (dlerror(), stderr); exit(1); } cosine = dlsym(handle, "cos"); if ((error = dlerror()) != NULL) { fprintf (stderr, "%s\n", error); exit(1); } printf ("%f\\n", (*cosine)(2.0)); dlclose(handle); } .if t .ft P .fi .RE .SH CRÉDITOS A interface dlopen surgiu no Solaris. A implementação linux foi escrita por Eric Youngdale, com ajuda de Mitch D'Souza, David Engel, Hongjiu Lu, Andreas Schwab e outros. Esta manpage foi escrita por Adam Richter. .SH VER TAMBÉM .BR ld(1) , .BR ld.so(8) , .BR ldconfig(8) , .BR ldd(1) , .BR ld.so.info . .SH TRADUZIDO POR LDP-BR em 21/08/2000. \&\fR\&\f(CWPaulo César Mendes (tradução)\fR \&\fR\&\f(CWxxxxxxxxxxxxxxxxxxxxxxxxx (revisão)\fR