[C++/Linux] Aanroepen functies vanuit .so werkt niet

Pagina: 1
Acties:

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Ik ben bezig met een klein projectje om een nieuw soort server te schrijven voor een bepaald chat programma. Hierin wil ik mensen de gelegenheid geven om zelf d.m.v. shared object files (modules) zelf delen code te schrijven, soort van scripts dus. Deze modules vertellen de core d.m.v. hooks welke functies aangeroepen moeten worden na welke acties. Voor degenen die er bekend mee zijn, hetzelfde principe als de hybrid IRCd gebruikt (dit wordt echter geen IRCd :P).

Ik heb al een paar problemen ondervonden, en die opgelost (verdomde name mangling van C++ en globale objecten die niet wilde werken). Één ding lukt echter nog steeds niet: het aanroepen van functies in het "core" programma vanuit deze modules.

Een voorbeeldje:

Het "core" programma:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef void (* Module_Functie_t)( void );

int testFunctie( int iets )
{
    printf( "iets = %d\n", iets );
}

int main( int argc, char ** argv )
{
    void * handle = dlopen( "./module.so", RTLD_LAZY );
    if ( ! handle )
    {
        printf( "Foutje: %s\n", dlerror() );
        exit( 0 );
    }

    Module_Functie_t functie = (Module_Functie_t) dlsym( handle, "ModuleFunctie" );
    if ( ! functie )
    {
        printf( "Foutje2: %s\n", dlerror() );
    }

    functie();
}


De module:
C++:
1
2
3
4
extern "C" void ModuleFunctie( void )
{
    testFunctie( 1 );
}


Natuurlijk ook met de bijbehorende headerfiles waar testFunctie( int iets ) ook in staat en die geinclude wordt in de module maar die laat ik even achterwegen anders wordt dit zo'n lap tekst. Lijkt me wel duidelijk.

Dit resulteert in:
Foutje: ./module.so: undefined symbol: _Z11testFunctiei

Nu hoor ik het al, name mangling.. Maar de module is echter wel bekend met de gemanglede naam, want "nm core" toont mij:
0804852c T _Z11testFunctiei
dit is exact dezelfde naam.

Nu is mijn vraag natuurlijk.. Kan iemand mij vertellen hoe ik dit WEL aan de praat kan krijgen :)

(al uitgebreid op google gezocht trouwens, het enige wat ik vind is het omgekeerde)

[ Voor 4% gewijzigd door Radiant op 22-10-2004 13:54 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je export de naam van je testFunctie niet. Tijd geleden dat ik daar iets mee heb gedaan, maar ik geloof dat je moest compilen met /shared oid

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Export klinkt een beetje meer voor Windows, ook die parameter (/shared) :P
Maar ik ben wel ff gaan googlen naar function exports, en kwam daarbij op het -rdynamic argument voor gcc, na dit gebruikt te hebben werkt het perfect :) Bedankt

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

die was het ja, rdynamic :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20-05 20:29

Robtimus

me Robtimus no like you

-fPIC -shared werkt bij mij ook (C, geen C++)

More than meets the eye
There is no I in TEAM... but there is ME
system specs