PDA

View Full Version : dlsym e undefined symbol -> spiegazione


Arpeda
24-09-2005, 00:19
--------- Main.cpp -----------
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

int main ( )
{
void *handle;
void (*stampa)(void);
char *error;

handle = dlopen ("./libtest.so", RTLD_LAZY);
if (!handle)
{
fprintf (stderr, "dlopen %s\n", dlerror());
exit(1);
}

dlerror(); /* Clear any existing error */
*(void **) (&stampa) = dlsym(handle, "stampa");
if ((error = dlerror()) != NULL)
{
fprintf (stderr, "dlsym %s\n", error);
exit(1);
}

( *stampa )();
dlclose(handle);
return 0;
}

---------- libtest.cpp -----------------
#include <iostream>

using namespace std;

void stampa()
{
cout << "ciao sono la prima libreria dinamica che creo" << endl;
}

----------parametri compilazione -------------
g++ -rdynamic -o Main Main.cpp -ldl
g++ -fPIC -c libtest.cpp
g++ -shared -o libtest.so libtest.o

---------- errore -----------
dlsym ./libtest.so: undefined symbol: stampa

ho risolto mettendo:
extern "C" void stampa() {...}

ora perņ vorrei capire il perchč senza non funzica.
Qualcuno sa darmi una spiegazione?

GioVesas
24-09-2005, 11:25
Perchč le funzioni in C++ sono "decorate":
siccome in C++ la stessa funzione puņ avere differenti parametri, secondo il tipo di questi viene aggiunto al nome globale una serie di numeri che la caratterizzano.
per esempio stampa puņ diventare stampa012.
Se provi a generare con e senza extern C il codice assembler del C++, vdrai la differenza