Problema con dlopen().

Iniciado por 0xDani, 4 Septiembre 2012, 21:38 PM

0 Miembros y 1 Visitante están viendo este tema.

0xDani

Hola!

Estoy tratando de cargar librerias dinamicas (.so en linux) dinamicamente, valga la redundancia xD. El problema es que he creado una simple libreria dinamica, con tres funciones estupidas (las que me hacia por defecto el C::B) y la funcion dlopen() siempre retorna NULL.


#include <dlfcn.h>
#include <stdio.h>

int main()
{
typedef int (*function)(int, int);
void* handle = dlopen("libtest.so", RTLD_LAZY);
if(!handle){ printf("dlopen"); return 1; }
function fnc = (function) dlsym(handle, "SampleAddInt");
fnc();
dlclose(handle);
return 0;
}


El archivo libtest.so esta en la misma carpeta que el ejecutable, y tampoco funciona si le pongo la ruta completa. Por supuesto la salida de la consola siempre es "dlopen".

¿Que puede estar pasando? ¿Porque dlopen() siempre falla?

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

avesudra

Prueba con esto que he encontrado aquí --> http://stackoverflow.com/questions/8193640/dlopen-search-path

If you want to ensure that a specific library is dlopen-ed, pass a path to dlopen, e.g. dlopen("/some/path/to/lib.so", RTLD_LOCAL) or maybe dlopen("./lib.so", RTLD_LOCAL) but not dlopen("lib.so", RTLD_LOCAL).
Prueba con este , ya puedes imaginar lo que he cambiado:
#include <dlfcn.h>
#include <stdio.h>

int main()
{
typedef int (*function)(int, int);
void* handle = dlopen("./libtest.so", RTLD_LAZY);
if(!handle){ printf("dlopen"); return 1; }
function fnc = (function) dlsym(handle, "SampleAddInt");
fnc();
dlclose(handle);
return 0;
}

Regístrate en

0xDani

Gracias por la respuesta! Que raro, creia haber leido todos los temas de stack overflow que tenian que ver con esto  :¬¬. Ha funcionado asi y con la ruta completa.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

avesudra

Cita de: 0xDani en  5 Septiembre 2012, 14:00 PM
Gracias por la respuesta! Que raro, creia haber leido todos los temas de stack overflow que tenian que ver con esto  :¬¬. Ha funcionado asi y con la ruta completa.

Saludos.
Jajajaja bueno , a uno se le pasa cualquier cosa  :silbar:

¡Un saludo!
Regístrate en

Foxy Rider

Estoooo, vale leer la manpage de dlopen() ... el tema de cómo se maneja el path para buscar la librería, está explicado ahí

0xDani

Cita de: Alex Mtx en  5 Septiembre 2012, 22:14 PM
Estoooo, vale leer la manpage de dlopen() ... el tema de cómo se maneja el path para buscar la librería, está explicado ahí


Yo no lo encontre, solo he visto esto:

Cita de: manpage dlopen()#include <dlfcn.h>

void *dlopen(const char *file, int mode);
The file argument is used to construct a pathname to the object file. If file contains a slash character, the file argument is used as the pathname for the file. Otherwise, file is used in an implementation-defined manner to yield a pathname.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM