Zugriff auf Variable ohne Speicheradresse zu kennen



  • Hallo!
    Ich habe ein etwas kompliziertes Problem und hoffe mir kann jemand helfen es zu lösen.
    Ich schreibe hier an einem Programm in C/C++. Dieses lädt eine dynamische Bibliothek nach und ruft in dieser Bibliothek eine Funktion auf.
    Jetzt mein Problem: Ich muss von der dynamischen Bibliothek aus auf eine Variable im Hauptprogramm zugreifen (um genau zu sein ist es ein Objekt), kenne aber innerhalb der dynamischen Bibliothek nicht die Speicheradresse dieser Variable. Ich kann leider auch nicht die Speicheradresse als Paramater an die Funktion übergeben, da ich an dem Funktionsaufruf nichts ändern darf / kann.

    Kennt da eventuel jemand eine Lösung, wie ich trotsdem an die Variable drankommen könnte?

    MfG
    FloFri



  • siehe RTLD_GLOBAL

    dlopen manpage



  • Hm, ich versteh das Flag zwar nicht ganz, aber wenn ich das richtig lese, kann man damit auf Variablen innerhalb der Bibliothek zugreifen, ich will aber genau den anderen Weg: ich will von der Bibliothek aus auf eine variable im hauptprogramm zugreifen.

    Dazu kommt noch, dass ich auf den aufruf von dlopen / LoadLibrary keinen zugriff habe, da der in einer zum hauptprogramm statisch gelinkten bibliothek geschiet.



  • FloFri schrieb:

    Hm, ich versteh das Flag zwar nicht ganz, aber wenn ich das richtig lese, kann man damit auf Variablen innerhalb der Bibliothek zugreifen, ich will aber genau den anderen Weg: ich will von der Bibliothek aus auf eine variable im hauptprogramm zugreifen.

    Ne, das hast du falsch verstanden. Mit RTLD_GLOBAL werden alle Symbole global exportiert => Du kannst auch aus der Library auf Symbole im Hauptprogramm zugreifen.

    Dazu kommt noch, dass ich auf den aufruf von dlopen / LoadLibrary keinen zugriff habe, da der in einer zum hauptprogramm statisch gelinkten bibliothek geschiet.

    Ohne die Adresse zu kennen wirst du die Variable einfach nicht ändern können.



  • Deswegen frag ich mich ja, wie ich an die Adresse rankommen könnte 🙄
    Ich hatte eben den einfall, dass über ein Memory Mapped File zu machen, aber vieleicht gibts ja noch was anderes.



  • Memory Mapped File sollte gehen, ja.

    Evtl. ginge es auch über GetProcAddress: man kann aus einer .EXE einfach mit __declspec(dllexport) Symbole exportieren. Diese müssten sich dann in der DLL über GetProcAddress holen lassen.
    Das für GetProcAddress nötige HMODULE bekommst du über GetModuleHandle(0).

    Kannst du z.B. eine Funktion exportieren die die Adresse des Objektes zurückgibt. Wenn du die extern "C" bekommt die auch keinen wild dekorierten Namen...



  • Hm, stimmt, warum bin ich da nicht selber drauf gekommen 🙄
    Da mein Hauptprogramm eigendlich eh schon in einer dynamischen Bibliothek ist, sollte das eigendlich kein Problem sein.

    Noch eine Folgefrage: Ist eigendlich eine statische Membervariable im gesammten Addressraum eines Prozesses die gleiche oder nur im selben Programm. Sprich: wenn ich in meinem Hauptprogramm und in meiner dynamischen Bibliothek jeweils die gleiche Klasse mit einer Statischen Membervariable nutze, hat die dann bei beiden den gleichen Wert oder sind die von einander unabhängig?


Anmelden zum Antworten