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
).
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:
De module:
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)
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 ]