Article View: es.comp.os.linux.programacion
Article #11928[Me respondo] Re: Cargar librerías dinámicas sin estar presentes en tiempo de compilación.
From: Xavier Montero
Date: Sun, 16 Sep 2001 01:33
Date: Sun, 16 Sep 2001 01:33
79 lines
3721 bytes
3721 bytes
Me respondo: La soluci�n est� aqu�.
http://www.linuxdoc.org/HOWTO/Program-Library-HOWTO/index.html
Para el ejemplo que propon�a, ambos plugins los he renombrado
de .cpp a .c y he compilado con gcc en vez de g++. Esto es
porque la tabla de s�mbolos de C es "normal" y el s�mbolo de
la funci�n "gimmelafrase()" se llama "gimmelafrase" en C,
pero en C++ era algo como "gimmelafrase__Fv" y hasta que no
descubra oficialmente de d�nde sale lo del __Fv a�adido y
qu� casos me puedo encontrar pasar� de usarlo.
Para el main, donde dec�a "qu� c�digo usar?" he inclu�do
la librar�a #include <dlfcn.h> como dice el howto y
en el c�digo he a�adido las llamadas a las funciones
dlopen, dlerror, dlsym y dlclose. El c�digo queda as�:
------ BEGIN OF SESSION ------
xavi@inspire:~/plugintest/plugin_test$ cat plugin_test.c
#include <stdio.h>
#include <dlfcn.h>
int main(int c, char ** a)
{
void * libh;
char * (*gimmelafrase) (void);
char * error;
//[C�digo de comprobaci�n de par�metros]
printf("Trying to load library: '%s'\n", a[1]);
if ( ( libh = dlopen( a[1], RTLD_NOW )) == NULL )
{
// Oops! The library could not be open!
printf("Library could not be open. Reason: %s\n", dlerror() );
}
else
{
// Good! We could load the library!
gimmelafrase = dlsym( libh, "gimmelafrase" );
if ((error = dlerror()) != NULL)
{
fprintf (stderr, "%s", error);
exit(1);
}
printf("%s\n", (*gimmelafrase)() );
dlclose( libh );
}
}
xavi@inspire:~/plugintest/plugin_test$
------ END OF SESSION ------
Y el resultado es lo esperado: El programa carga y ejecuta c�digo
objeto compilado en tiempo de ejecuci�n:
------ BEGIN OF SESSION ------
xavi@inspire:~/plugintest/plugin_test$ ./plugin_test
/home/xavi/plugintest/plugin_a/plugin_a.so
Trying to load library: '/home/xavi/plugintest/plugin_a/plugin_a.so'
This is the output of plugin a
xavi@inspire:~/plugintest/plugin_test$ ./plugin_test
/home/xavi/plugintest/plugin_b/plugin_b.so
Trying to load library: '/home/xavi/plugintest/plugin_b/plugin_b.so'
----- oooh, i'm plugin BBBB ----
xavi@inspire:~/plugintest/plugin_test$
------ END OF SESSION ------
Fijaos que el output del programa viene alimentado en cada una de
las 2 invocaciones por lo que el plugin ha devuelto.
Espero que sea de utilidad si alguien quiere hacer programas
"extensibles" por otras personas.
As� que... duda autosolucionada.
Saludos.
Xavi.
Technical Details
Message-ID:
<3BA4016F.23ACC509@dsitelecom.com>Path:
arc1-ca.pugleaf.net!archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!193.251.151.101!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!news.antakira.com!not-for-mailReferences:
<3BA3E2B3.40E8D8B9@dsitelecom.com>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,26ed3f936bc3887b X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-09-15 19:06:52 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!193.251.151.101!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!news.antakira.com!not-for-mail From: Xavier Montero <xmontero@dsitelecom.com> Newsgroups: es.comp.os.linux.programacion Subject: [Me respondo] Re: Cargar librerías dinámicas sin estar presentes en tiempo de compilación. Date: Sun, 16 Sep 2001 03:33:35 +0200 Organization: Digital Sound Items Lines: 79 Message-ID: <3BA4016F.23ACC509@dsitelecom.com> References: <3BA3E2B3.40E8D8B9@dsitelecom.com> NNTP-Posting-Host: 212.25.147.135 Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: news.wanadoo.es 1000605858 16615 212.25.147.135 (16 Sep 2001 02:04:18 GMT) X-Complaints-To: usenet@wanadoo.es NNTP-Posting-Date: Sun, 16 Sep 2001 02:04:18 +0000 (UTC) X-Mailer: Mozilla 4.77 [en] (Windows NT 5.0; U) X-Accept-Language: en