Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: 0xDani en 4 Septiembre 2012, 21:38 PM

Título: Problema con dlopen().
Publicado por: 0xDani en 4 Septiembre 2012, 21:38 PM
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.
Título: Re: Problema con dlopen().
Publicado por: avesudra en 4 Septiembre 2012, 23:52 PM
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;
}

Título: Re: Problema con dlopen().
Publicado por: 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.
Título: Re: Problema con dlopen().
Publicado por: avesudra en 5 Septiembre 2012, 18:45 PM
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!
Título: Re: Problema con dlopen().
Publicado por: Foxy Rider en 5 Septiembre 2012, 22:14 PM
Estoooo, vale leer la manpage de dlopen() (http://pubs.opengroup.org/onlinepubs/9699919799/functions/dlopen.html) ... el tema de cómo se maneja el path para buscar la librería, está explicado ahí
Título: Re: Problema con dlopen().
Publicado por: 0xDani en 5 Septiembre 2012, 22:34 PM
Cita de: Alex Mtx en  5 Septiembre 2012, 22:14 PM
Estoooo, vale leer la manpage de dlopen() (http://pubs.opengroup.org/onlinepubs/9699919799/functions/dlopen.html) ... 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.