Memory Mapping zugreifbar machen



  • ich glaube ich habe einen Weg gefunden wie man die Impl. von ner Funktion speichern kann!! es funzt aber noch nicht ganz, also vorsicht ich übernehme keine Haftung für schäden oder so

    void hallo(int tschuess) {int z=tschuess,j=-tschuess;while(!z<j*j)j++,z--;return;}
    
    void main(void)
    {
    // FUNKTION SPEICHERN
    void (*test) = hallo;
    FILE* dat=fopen("fkt.dat","wb");
    fwrite(test,sizeof(hallo),1,dat);
    fclose(dat);
    }
    

    Fehler gibt snoch bei "sizeof(hallo)" aber wenn ich testweise mal 1000 angebe krieg ich auch was raus. beim Reinladen muß man eine groß genuge Fkt machen die nix tut:

    void leer(int param) {
    //großer leerraum
    char leeredaten[1000]={0};
    }
    
    void meinHALLO(int tschuess) {
    char leeredaten[1000]={0};
    }
    
    void main(void)
    {
    // FUNKTION LADEN
    void (*test) = leer;
    FILE* dat=fopen("fkt.dat","rb");
    fread(test,1000,1,dat);
    fclose(dat);
    void (*neu)=meinHALLO;
    memcpy(meinHALLO, test, 1000 );
    }
    

    leider geht das nicht gut.
    warum=?



  • Schmerz lass nach... 😮
    *scnr*


  • Mod

    aua.

    ich glaube ich habe einen Weg gefunden wie man die Impl. von ner Funktion speichern kann!!

    das willst du gar nicht.

    es funzt aber noch nicht ganz, also vorsicht ich übernehme keine Haftung für schäden oder so

    void hallo(int tschuess) {int z=tschuess,j=-tschuess;while(!z<j*j)j++,z--;return;}
    
    void main(void)
    {
    // FUNKTION SPEICHERN
    void (*test) = hallo;
    FILE* dat=fopen("fkt.dat","wb");
    fwrite(test,sizeof(hallo),1,dat);
    fclose(dat);
    }
    

    funktionspointer können nicht (oder höchtens optional und dann sollte die funktion besser auch entsprechend dekoriert sein) in objektpointer umgewandelt werden.

    Fehler gibt snoch bei "sizeof(hallo)" aber wenn ich testweise mal 1000 angebe krieg ich auch was raus.

    funktionen sind keine objekte, und nur objekte haben eine grösse, die du mit sizeof erfahren kannst.

    beim Reinladen muß man eine groß genuge Fkt machen die nix tut:

    void leer(int param) {
    //großer leerraum
    char leeredaten[1000]={0};
    }
    
    void meinHALLO(int tschuess) {
    char leeredaten[1000]={0};
    }
    
    void main(void)
    {
    // FUNKTION LADEN
    void (*test) = leer;
    FILE* dat=fopen("fkt.dat","rb");
    fread(test,1000,1,dat);
    fclose(dat);
    void (*neu)=meinHALLO;
    memcpy(meinHALLO, test, 1000 );
    }
    

    leider geht das nicht gut.
    warum=?

    zunächst einmal schlägt das auf systemen fehl, bei denen das codesegment read-only ist, und das ist praktisch überall der fall heutzutage.
    selbst wenn das schreiben erfolgreich ist, musst du sichergehen, dass du keinen anderen code überschreibst und - was du i.allg. nicht wissen kannst - dass der code der funktion verschiebbar ist.



  • Selbst wenn man den Code auf den Stack schiebt, schlägt zumindest bei brandaktuellen Systemen das NX-Bit zu, welches die Codeausführung verhindert. Die restlichen Argumente hat camper ja schon gelistet.



  • 1. Frage die man sich stellen muss, wozu um Herr Gottes Willen braucht man das ? ^^

    wenn man die Antwort kennt, kann man sicher ne elegantere loesung finden ^^

    Wenn du zum beispiel nen funktionsplotter bauen willst, wo du die funktion als codefragment einer programmiersprache eingeben willst, um das zeugs dann von nem compiler uebersetzen lassen willst .... wuerd ich dynamic vorziehen !

    also zu laufzeit den quellcode aus nem rahmentemplate und deiner funktionsbeschreibung zusammenbasteln, den code an den zustaendigen compiler schicken und daraus ne dll (so unter linux) basteln, die dll(so) laden und die funktion aufrufen ....

    Ansonsten faellt mir echt keine sinnvolle verwendung von sowas ein, es sei denn du willst aus irgendwelchen binaries code klauen und in deine eigenen libs verbauen ^^

    Ciao ...



  • Vielleicht denkst du, du seist der erste, der diese tolle Methode entdeckt hat, aber in Wirklichkeit liest man von solchen Dingen nie etwas, weil es im Allgemeinen als unsauber betrachtet wird und natürlich erst recht nicht standardkonform ist. Dass man Programmcode von Funktionen hin- und herkopieren kann und man ihn in einigen Fällen nach Laden von der Festplatte wieder ausführen kann, sollte ja klar sein, das ist auch nichts besonderes. 🙂
    Was hat es eigentlich mit dem Threadtitel auf sich? 😕


Anmelden zum Antworten