Shared Object soll funktionen des Hauptprogramms verwenden können???



  • Hallo an alle
    ich google jetzt schon mindestens 5 stunden und komm auf keine lösung 😃

    also ich möchte ein library so dynamisch mit dlopen laden was auch funktioniert nun möchte ich aber in dem so eine funktion aufrufen welche in dem hauptprogram welches die so aufruft definiert ist.
    in dem fall kann er mit dlopen die library nicht laden. es müsste dohc irgend einen weg geben um die funktionen im hauptprogram sichtbar zu machen

    grüße
    helmi





  • In der Hoffnung, dass der andere Thread geschlossen wird, antworte ich mal hier.

    Normalerweise ist das kein Problem. Innerhalb der geladenen Library sind die Symbole des Hauptprogramms normalerweise bekannt. Du musst mehr Informationen liefern (oder die Frage so formulieren, dass man versteht, was Du möchtest ;)).



  • hallo
    sorry für den doppelpost war vorerst im falschen forum!

    ok also ich hab folgendes szenario (darstellung nicht syntaxgerecht)
    beide projekte lassen sich kompilieren nur wenn main das lib1.so laden will schlägt es fehl mit dem fehler undefined symbol funcMain verwende ich funcMain niocht in lib1 dann funkts.wie kann ich jetzt funcMain für lib1 sichtbar machen ohne funcMain wieder in ein so zu geben?

    Hauptprogram definiert eine funktion
    extern void funcMain()
    {
    printf("in main\n");
    }
    int main()
    {
    hLib1 = dlload("lib1", RTLD_LAZY);
    funcLib = dlsym(hLib1, "funcLib");
    funcLib();
    }

    lib1 ist ein shared object und definiert eine funktion welche
    ihrerseits eine function aus dem hauptprogram definiert
    extern void funcLib()
    {
    printf("in lib\n");
    funcMain();
    }

    gruß
    helmut



  • Bitte benutz Code-Tags.

    Probier mal das RTLD_GLOBAL-Flag bei dlopen aus.



  • Hmmm, eigentlich geht RTLD_GLOBAL genau in die andere Richtung. Das führt spätestens dann zu Symbolkonflikten, wenn man mehrere Objects lädt, die dieselben Symbole definieren.

    Ich verstehe auch nicht, warum es da zum Fehler kommt. In meinen Anwendungen funktioniert das bisher immer ohne zusätzlichen Aufwand. Ich benutze lediglich RTLD_NOW statt RTLD_LAZY.

    BTW: Was issn dlload, ich kenne nur dlopen?



  • hallo
    RTLD_GLOBAL funktioniert nur für folgend geladene libs
    also wenn ich lib1 mit RTLD_GLOBAL lade dann stellt dieses lib alle funktionen einem eventeull nächsten mit dlopen geladenen lib zur verfügung.

    in meinem fall müsste ich es aber schon dem hauptprogram beibringen dass es seine functionen zur vervügung stellt. eventuell über eine linker option hab aber nix gefunden.



  • LordJaxom_lg schrieb:

    BTW: Was issn dlload, ich kenne nur dlopen?

    ich meine natürlich dlopen



  • Narf, ich blick durch meine eigenen Makefiles nicht mehr durch 🙂

    Das Hauptprogramm muss mit -rdynamic gebunden werden, damit der Linker nicht-benutzte Symbole auch exportiert.



  • 🙂 tausend dank -rdynamic option wars!

    grüße halmut



  • Wär es nich besser einen Zeiger auf funcMain an funcLib zu übergeben...?



  • ihoernchen schrieb:

    Wär es nich besser einen Zeiger auf funcMain an funcLib zu übergeben...?

    einen zeiger auf funcmain is für mich nicht so hilfreich weil mein Hauptprogram einen vielzahl von funktionen exportiert mit -rdynamic funktioniert das sehr gut hauptprogramm stellt so alle funktionen den libs zur verfügung


Anmelden zum Antworten