g_module_open()



  • hi,
    ich versuch gerade ein kleines plugin-system zu schreiben. was ich allerdings gerade bemerkt habe macht mich garnicht glücklich. ich habe zwei unterschiedliche plugins die von mir mit g_module_open() geladen werden.
    aus irgendeinem grund wird aber immer nur das erste plugin richtig geladen. was bedeutet, dass beidesmal die ausgabe von dem ersten plugin ausgegeben wird. auch die speicheradressen der funktionen sowie variablen sind gleich. programmiert mit glib. wäre toll wenn mir das jemand erklären könnte.

    #include <glib.h>
    #include <gmodule.h>
    #include <dlfcn.h>
    
    typedef gint ( *InitFunc ) ( void );
    typedef void ( *DestroyFunc ) ( void );
    
    int main( int argc, char **argv ) {
        GModule *mod1, *mod2;
        InitFunc init1, init2;
        DestroyFunc des1, des2;
    
        if ( ( mod1 = g_module_open( "plugins/test.so", G_MODULE_BIND_LAZY ) ) == NULL ) {
            return 0;
        }
    
        if ( ( mod2 = g_module_open( "plugins/banlist.so", G_MODULE_BIND_LAZY ) ) == NULL ) {
            return 0;
        }
    
        g_module_symbol( mod1, "init", ( gpointer * ) &init1 );
        g_module_symbol( mod2, "init", ( gpointer * ) &init2 );
        g_module_symbol( mod1, "destroy", ( gpointer * ) &des1 );
        g_module_symbol( mod2, "destroy", ( gpointer * ) &des2 );
    
        init1();
        init2();
    
        des1();
        des2();
    
        g_print( "%s\n", g_module_name( mod1 ) );
        g_print( "%s\n", g_module_name( mod2 ) );
    
        g_module_close( mod1 );
        g_module_close( mod2 );
    
        return 0;
    }
    

    Ausgabe:

    Base: b7f807f0
    Init: b7f7f55c
    0804b3f0
    Plugin added: b7f7f600
    Base: b7f807f0
    Init: b7f7f55c
    0804b3f0
    Plugin added: b7f7f600
    0804b3f0
    Plugin removed.
    0804b3f0
    Plugin removed.
    plugins/test.so
    plugins/banlist.so
    

    wie man sieht sind die adressen der variablen und funktionen beider plugins identisch.

    danke,
    blan



  • Also mit deinem Code für das Hauptprogramm und dem folgenden Code für die Plugins:

    #include <stdio.h>
    #include <glib.h>
    
    extern "C" gint init ()
    {
    	printf ("init: 1\n");
    	return 0;
    }
    
    extern "C" void destroy ()
    {
    	printf ("destroy: 1\n");
    }
    

    erhalte ich folgende Ausgabe:

    init: 1
    init: 2
    destroy: 1
    destroy: 2
    plugins/test.so
    plugins/banlist.so
    

    (bei banlist.so hab ich natürlich die 1 gegen durch 2 ersetzt)



  • also ich habe das problem mit einem anderen flag bei der funktion g_module_open() behoben. komisch, dass es bei dir funktioniert. wozu machst du ein extern "C" ?

    blan



  • blan schrieb:

    wozu machst du ein extern "C" ?

    Also komischerweise bekomme ich ein Segmentation Fault, wenn ich das weglasse. 😕



  • hmm.. das ist schon ein sehr merkwürdigs verhalten. naja solange es mit dem G_MODULE_BIND_LOCAL bzw G_MODULE_BIND_MASK flag funktioniert werde ich es dabei belassen. trotzdem danke!

    blan


Anmelden zum Antworten