Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/07/2003, 04:40
Avatar de boricles
boricles
 
Fecha de Ingreso: diciembre-2002
Mensajes: 53
Antigüedad: 21 años, 4 meses
Puntos: 0
Librerías compartidas en linux

Hola

Estoy trabajando con librerias compartidas escritas en C bajo linux.

Tengo un ejecutable que carga dichas librer�as y ejecuta sus respectivas funciones.

Hasta el momento siempre trabaj� con una sola librer�a. Abr�a la librer�a, cargaba las funciones y las ejecutaba.
Todo iba bien sin ningun problema.

Ahora necesito trabajar con dos librerias (o m�s). Pero por alguna extra�a raz�n me est� saliendo una violaci�n de segmento.
Si trabajo con cada librer�a por separado no pasa nada (llamando a varias funciones de la misma librer�a).
El problema se da cuando llamo a una librer�a y luego a otra.

Busqu� en google y no encontr� nada acerca de un l�mite para trabajar con librer�as din�micas.

Alguno de ustedes tuvo este problema (o similar) ? Cu�l podr�a ser la causa?

Gracias por adelantado y disculpen las molestias.

P.D.

Adjunto el c�digo fuente de mi ejecutable como ejemplo.

gpointer *x1; //manejador libreria 1
gpointer *x2; //manejador libreria 2

gpointer f1();
gpointer f2();

//Funcion 1
gpointer f1()
{
gpointer* s3_probar_cargar;
gchar *error;
gchar nombre_biblioteca[100];

strcpy(nombre_biblioteca,"/taller/");
strcat(nombre_biblioteca,"libs3pue.so");

if(x1)
{
dlclose(x1);
x1=NULL;
}

x1 = dlopen (nombre_biblioteca, RTLD_LAZY); //abrir libreria
if (!x1)
{
fputs (dlerror(), stderr);
exit(1);
}

s3_probar_cargar = dlsym(x1, "funcion_x");

if ((error = dlerror()) != NULL)
{
fputs(error, stderr);
exit(1);
}

(*s3_probar_cargar)('�',1,2,3,f2); //esta funci�n tiene como �ltimo par�metro un puntero a la siguiente funci�n a ejecutar

if(x1)
{
dlclose(x1);
x1=NULL;
}

}


//Funcion 2
gpointer f2()
{
gpointer* s3_probar_cargar;
gchar *error;
gchar nombre_biblioteca[100];

strcpy(nombre_biblioteca,"/taller/");
strcat(nombre_biblioteca,"libs3pue1.so");

if(x2)
{
dlclose(x2);
x2=NULL;
}

x2 = dlopen (nombre_biblioteca, RTLD_LAZY);
if (!x2)
{
fputs (dlerror(), stderr);
exit(1);
}

s3_probar_cargar = dlsym(x2, "funcion_y");

if ((error = dlerror()) != NULL)
{
fputs(error, stderr);
exit(1);
}

(*s3_probar_cargar)('�',1,2,3,4,5,6);

if(x2)
{
dlclose(x2);
x2=NULL;
}

}


int main()
{
f1();
}