Article View: es.comp.os.linux.programacion
Article #11927Cargar librerías dinámicas sin estar presentes en tiempo de compilación.
From: Xavier Montero
Date: Sat, 15 Sep 2001 23:22
Date: Sat, 15 Sep 2001 23:22
121 lines
5520 bytes
5520 bytes
Supongamos que quiero hacer un programa para Linux tal que
a poisteriori de ser publicado la gente pueda desarrollar
plugins para tal programa.
Lo que est� claro es que deberemos ponernos de acuaerdo con
una API. Una vez hecho eso, la forma que m�s se me ocurre (quiz�s
por ser la forma en la que lo hago en Win, pero no necesariamente
ni la mejor ni la �nica), es que todos los plugins se compilen
garantizando que tienen una determinada funci�n (o m�s de una)
compilada en una librer�a din�mica, a la que el programa principal
llama previa carga de la librer�a din�mica.
En Win, por ejemplo, tengo una funci� para "cargar" una DLL en
tiempo de ejecuci�n, s�lo sabiendo su nombre. Una vez en memoria,
sabiendo el nombre de la funci�n y los par�metros puedo llamar
a la funci�n.
Los entry-points de la DLL son resuletos en tiempo real en la
ejecuci�n del programa (la DLL no tiene por qu� existir ni
estar presente en el momento en que compilo el ejecutable
principal).
Pues bien, quiero hacer lo mismo en Linux. Se compilar una
librer�a din�mica. Aqu� vuelco el c�digo fuente y el
proceso de compilaci�n de un posible plugin que s�lo
tiene una funci�n gimmelafrase() que retorna un string.
Lo compilo haciendo un fichero .so de librer�a din�mica.
------ BEGIN OF SESSION ------
xavi@inspire:~$
xavi@inspire:~$ cd plugintest/
xavi@inspire:~/plugintest$ cd plugin_a/
xavi@inspire:~/plugintest/plugin_a$ cat plugin_a.cpp
char * gimmelafrase()
{
return "This is the output of plugin a";
}
xavi@inspire:~/plugintest/plugin_a$ cat step1
g++ -fPIC -c plugin_a.cpp -o plugin_a.o
xavi@inspire:~/plugintest/plugin_a$ cat step2
ld -shared plugin_a.o -o plugin_a.so
xavi@inspire:~/plugintest/plugin_a$ ./step1
xavi@inspire:~/plugintest/plugin_a$ ./step2
xavi@inspire:~/plugintest/plugin_a$ ls -l
total 20
-rw-r--r-- 1 xavi staff 68 Sep 15 20:07 plugin_a.cpp
-rw-r--r-- 1 xavi staff 1192 Sep 15 22:48 plugin_a.o
-rwxr-xr-x 1 xavi staff 2433 Sep 15 22:48 plugin_a.so
-rwxr-xr-x 1 xavi staff 40 Sep 15 20:08 step1
-rwxr-xr-x 1 xavi staff 37 Sep 15 20:08 step2
xavi@inspire:~/plugintest/plugin_a$
------ END OF SESSION ------
Ahora supongamos otro plugin B que devuelve la frase
"Hola , soy B".
Bien, lo que deseo es hacer un programa tal que _no_ conozca
a plugin_a.* ni a plugin_b.*, aunque, por supuesto s� conocer�
algo del estilo:
------ BEGIN OF SESSION ------
xavi@inspire:~/plugintest/plugin_test$ cat plugin.h
char * gimmelafrase();
xavi@inspire:~/plugintest/plugin_test$
------ END OF SESSION ------
que deber� incluir en el #include de turno.
Quiero compilar plugin_test.cpp de forma que el compilador
sepa cu�l es el formato de la llamada a la funci�n
gimmelafrase(), pero que _no_ intente linkarlo puesto que
la librer�a din�mica no estar� presente.
Luego quiero pasarle como par�metro si quiero cargar en
RAM la .so del plugin A o del B y una vez en RAM llamar
a la funci�n con �xito, del estilo:
------ BEGIN OF SESSION ------
xavi@inspire:~/plugintest/plugin_test$ cat plugin_test.cpp
#include <stdio.h>
#include "plugin.h"
// Cuidado! ejemplo err�neo
void main(int c, char ** a)
{
// printf("Numpar: %d\n", c);
if(c != 2)
{
printf("Usage: %s library_name\n", a[0]);
}
else
{
printf("Trying to load library: '%s'\n", a[1]);
// **************
printf("Plugin says: '%s'", gimmelafrase());
}
}
xavi@inspire:~/plugintest/plugin_test$
------ END OF SESSION ------
Mi pregunta es: Qu� debo poner en ***************** para
cargar la librer�a que se pase en a[1] y c�mo debo compilar
para que el linker no le intente resolver los puntos de
entrada? Evidentemente la gracia est� en que una vez compilado,
si necesidad de ser modificado ni recompilado, pueda cargar
librer�as nuevas y diferentes, siempre que �stas hayan
usado la declaraci�n de plugin.h como proto para la funci�n
de "relaci�n" entre programa-principal y funciones-de-librer�a.
Otra pregunta es si las librer�as cradas como .so sirven para
tal efecto o se deben compilar de otra forma.
Saludos y gracias!
Technical Details
Message-ID:
<3BA3E2B3.40E8D8B9@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-mailShow Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,26ed3f936bc3887b,start X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-09-15 17:11:02 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: Cargar librerías dinámicas sin estar presentes en tiempo de compilación. Date: Sun, 16 Sep 2001 01:22:27 +0200 Organization: Digital Sound Items Lines: 121 Message-ID: <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 1000598402 5475 212.25.147.135 (16 Sep 2001 00:00:02 GMT) X-Complaints-To: usenet@wanadoo.es NNTP-Posting-Date: Sun, 16 Sep 2001 00:00:02 +0000 (UTC) X-Mailer: Mozilla 4.77 [en] (Windows NT 5.0; U) X-Accept-Language: en