C/Visual C - Simbolos en ejecutables

 
Vista:

Simbolos en ejecutables

Publicado por Creb (202 intervenciones) el 27/06/2003 21:23:01
Hola!

Alguno sabeis si se puede acceder a los símbolos de un ejecutable desde el ejecutable mismo?
Me explico: si se carga una DLL en Windows, o una librería de enlace dinámico en Linux, se puede acceder, mediante el manejador obtenido, a las direcciones de los simbolos (funciones) que esa libreria exporta (con dlsym en Linux o GetProcAddress en Windows).

Pues bien, me gustaría hacer lo mismo, pero con los simbolos _del ejecutable_, en vez de una librería cargada. Se puede hacer? Como?

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Simbolos en ejecutables

Publicado por Creb (202 intervenciones) el 28/06/2003 01:18:14
Hola!
Bueno, ya me contesto yo mismo, porque lo he conseguido. Si se puede; pongo como por si a alguien le interesa...

EN WINDOWS:
#include <windows.h>´
#include <stdio.h>

extern "C" {
_declspec( dllexport ) int funcion() {
printf("funcion exportada!!!\n");
return 0;
}
}

int main(int argc, char *argv[]) {
int (*func)();
func = (int(*)())GetProcAddress(GetModuleHandle(NULL), "funcion");
if (!func) {
printf("Error al sacar el puntero.\n");
return -1;
} else
func();
return 0;
};

EN LINUX

#include <stdio.h>
extern "C" {
int f() {
printf("funcion f().\n");
return 0;
}
}

#include <dlfcn.h>
int main() {
void *handle;
int (*fun)();
char *error;

handle = dlopen(NULL, RTLD_NOW);
if (!handle) {
printf(dlerror());
return -1;
}
fun =(int(*)()) dlsym(handle, "f");
if ((error = dlerror()) != NULL) {
printf("ERROR AL SACAR f(): %s \n", error);
} else
fun();
}

Y hay que comilarlo como (suponiendo main.cpp):

gcc main.cpp -ldl -rdynamic

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Simbolos en ejecutables

Publicado por JoseGR (1 intervención) el 30/06/2003 11:25:05
Hola, son una pregunta, ¿para que quieres importar una funcion desde un modulo hacia si mismo????, si ya el compilador conoce todas las direcciones de los simbolos, basta con hacer:

func = (int(*)()) &funcion;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar