Ver Mensaje Individual
  #3 (permalink)  
Antiguo 16/07/2003, 12:05
Avatar de boricles
boricles
 
Fecha de Ingreso: diciembre-2002
Mensajes: 53
Antigüedad: 21 años, 4 meses
Puntos: 0
Hola

Gracias por la respuesta.

En un futuro no muy lejano reemplazaré todo lo que tengo por las glib. Pero por el momento me quedo así, y gracias por la sugerencia, en serio.

Pues estudiando más a fondo el código que te mandé descubrí que la violación ocurre al finalizar la llamada a la "funcion_y" justo antes de cerrar la librería, no entiendo la razón de la violación.

Lamentablemente no me fijé al pastear que las "ñs" y los acentos salieron mal, aqui va nuevamente el código y el mensaje original.

Gracias nuevamente

///<<<<

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();
}

///>>>