Foros del Web » Programación para mayores de 30 ;) » Programación General »

Librerías compartidas en linux

Estas en el tema de Librerías compartidas en linux en el foro de Programación General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/07/2003, 04:40
Avatar de 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();
}
  #2 (permalink)  
Antiguo 16/07/2003, 11:18
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola,

Tiene una apariencia muy interesante el problema que describes. Lamentablemente, parece que algo relacionado con el juego de caracteres bajo el que publicaste el mensaje ha arruinado buena parte del contenido de éste, incluyendo el código. Por ahora apenas te puedo decir lo siguiente.

Al parecer estás usando glib, lo cual me parece especialmente interesante; personalmente yo utilizo esta librería con frecuencia cuando programo en C. Al mismo tiempo utilizas librerías estándar como string.h, stdio.h y dlfcn.h. En este caso yo te recomendaría que, dado que ya usas glib, reemplazaras el uso de las otras librerías estándar con funciones que glib mismo provee. De este modo tu código será más coherente, elegante y portable. Es posible que incluso más eficaz; glib es una hermosa librería, ciertamente.

Las funciones de string.h pueden ser reemplazadas por las funciones para manipulación de cadenas:

http://developer.gnome.org/doc/API/2...Functions.html


Las funciones de salida estándar, con sus equivalentes en glib:

http://developer.gnome.org/doc/API/2...ssertions.html


Y finalmente, podrías probar la carga dinámica de librerías en tiempo de ejecución con el juego de funciones para carga dinámica de módulos de glib:

http://developer.gnome.org/doc/API/2...f-Modules.html


Aparte de estas simples recomendaciones, me gustaría que nos contaras más sobre tu problema, ya que te repito que me parece muy interesante.

Si fuera posible, te pediría que por favor publicaras el código fuente que ya has escrito nuevamente, y te asegures de que se despliegue correctamente en el navegador. Asi mismo, si es posible, que publicaras el código fuente de las librerías libs3pue y libs3pue1 para estudiarlo. Gracias.

Un cordial saludo.
  #3 (permalink)  
Antiguo 16/07/2003, 12:05
Avatar de 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();
}

///>>>
  #4 (permalink)  
Antiguo 17/07/2003, 08:58
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola otra vez,

He estado estudiando un poco más tu código y vuelvo y te repito que realmente me ha generado interés el problema que tienes. Sin embargo, tendré que pedirte nuevamente un par de favores.

Número uno, el código esta vez luce mejor, pero aun sigo sin saber cual es el caracter que envias como primer argumento en estas líneas:

[code]
(*s3_probar_cargar)('\x{FFFD}',1,2,3,f2);

...

(*s3_probar_cargar)('\x{FFFD}',1,2,3,4,5,6);
[code]


Número dos, creo que sería muy útil si pudieras incluir también el código de las librerías que estás cargando dinámicamente: libs3pue y libs3pue1. Posiblemente allí se encuntra la causa del fallo, o al menos leyendo sus fuentes es posible que se encuentre alguna información que lleve a la solución del problema.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:27.