elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con dlfcn.h.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con dlfcn.h.  (Leído 2,191 veces)
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Problema con dlfcn.h.
« en: 7 Agosto 2012, 20:37 pm »

Bueno estoy intentando usar funciones de librerias dinamicas sin hacer un include, y he encontrado un ejemplo en el que se consigue esto en una pagina de documentacion de dlfcn.h(pubs.opengroup.org/onlinepubs/7908799/xsh/dlsym.html). El problema es que he intentado hacer algo similar con una funcion que recibe dos enteros y retorna su suma y no me termina de salir.
Aqui esta el codigo:
Código
  1. #include <iostream>
  2. #include <dlfcn.h>
  3.  
  4. using std::cout;
  5.  
  6. int main()
  7. {
  8.    int a=2, b=3;
  9.    int fptr(int, int);
  10.    void* handle = dlopen("libprueba.so", RTLD_LAZY);
  11.    fptr = (int(int, int))dlsym(handle, "SampleAddInt");
  12.    int c = fptr(a, b);
  13.    cout << c;
  14.    dlclose(handle);
  15.    return 0;
  16. }
  17.  
Este es el contenido de libprueba.so:
Código
  1. int SampleAddInt(int i1, int i2)
  2.    {
  3.        return i1 + i2;
  4.    }
Y el error que me da el compilador es cuando le intento asignar a fptr el resultado de dlsym, me dice conversion invalida al tipo de funcion 'int(int, int)'.
¿Como lo puedo solucionar? Debe de haber alguna manera de realizar la conversion.

Saludos.


En línea

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
Eternal Idol
Kernel coder ajeno al tiempo
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con dlfcn.h.
« Respuesta #1 en: 7 Agosto 2012, 22:18 pm »

Código
  1. int (*fptr)(int, int) = (int(*)(int, int))dlsym(handle, "SampleAddInt");

Aunque yo preferiria:
Código
  1. typedef int (*SampleAddInt_ptr)(int,int);
  2. ...
  3. SampleAddInt_ptr SampleAddInt = (SampleAddInt_ptr)dlsym(handle, "SampleAddInt");
  4. int c = SampleAddInt(a, b);


« Última modificación: 7 Agosto 2012, 22:22 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Problema con dlfcn.h.
« Respuesta #2 en: 8 Agosto 2012, 11:00 am »

Gracias por la respuesta, pero ya casi lo tengo solucionado, ahora lo unico que me falla es que no linkea con la libreria. Eso si, he desistido de pasarle parametros. Dejo el codigo por si a alguien le sirve, deberia funcionar.

Código
  1. #include <iostream>
  2. #include <dlfcn.h>
  3.  
  4. using std::cout;
  5.  
  6. int main()
  7. {
  8.    typedef void (*function)();
  9.    function result;
  10.    void* handle = dlopen("libprueba-plugin2.so", RTLD_LAZY);
  11.    result = (function)dlsym(handle, "Hello");
  12.    (*result)();
  13.    dlclose(handle);
  14.    return 0;
  15. }
  16.  

Saludos.

Edit: No puedo compilar este programa, el compilador me lanza 'undefined reference to dlopen()' y lo mismo para las otras funciones de dlfcn.h. He probado a poner -ldl, pero el compilador me da estos errores:
Código:
In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x6f): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x74): undefined reference to `std::ios_base::Init::~Init()'
collect2: ld devolvió el estado de salida 1
« Última modificación: 8 Agosto 2012, 12:05 pm por daniyo » En línea

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
Eternal Idol
Kernel coder ajeno al tiempo
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con dlfcn.h.
« Respuesta #3 en: 8 Agosto 2012, 12:16 pm »

De nada y ahi arriba tenes como hacerlo con parametros y valor de retorno.

¿Estas usando g++ para compilar?
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Problema con dlfcn.h.
« Respuesta #4 en: 8 Agosto 2012, 12:26 pm »

No, estaba usando gcc, pero ahora con g++ ha compilado. Ahora produce violacion de segmento xD.

Saludos.
En línea

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
Eternal Idol
Kernel coder ajeno al tiempo
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con dlfcn.h.
« Respuesta #5 en: 8 Agosto 2012, 12:46 pm »

No, estaba usando gcc, pero ahora con g++ ha compilado. Ahora produce violacion de segmento xD.

Saludos.

Deberias comprobar que dlsym no este devolviendo NULL antes de llamar a result.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Problema con dlfcn.h.
« Respuesta #6 en: 8 Agosto 2012, 12:57 pm »

Ah pues el problema ha resultado estar en dlopen(). dlerror() me dice que no pudo abrir la libreria dinamica. Es raro, porque la tengo en el mismo directorio. Voy a probar a ponerle la ruta completa.
 
Saludos.

Edit: No la abre ni con la ruta completa.
Edit2: Despues de dlopen(), llamo a dlerror() y me da el error: "libejemplo.so: cannot open shared object file: No such file or directory". He puesto la libreria dinamica en el mismo directorio que el programa, y tambien le he puesto la ruta completa, pero me sigue saltando el mismo error.
« Última modificación: 8 Agosto 2012, 17:53 pm por daniyo » En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,907 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines