Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Dateien ausführen

  1. #1
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53

    Dateien ausführen

    HI leute

    Ich möchte gerne mal wissen wie ich im C eine datei ausführe
    und ich meine nicht mit system oder wie auch immer man das einfach macht, ich meine, wie kann ich eine datei manuell einlesen und ausführen?
    Die struktur ausführbarer dateien ist mir zZ egal, nehmen wir einfach an ich hab hier eine einfacher objekt datei die nichts als ausführbaren code enthält

    Wie kann ich das lesen und ausführen?


    GreetZ
    Woolf
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

  2. #2
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Hmm..

    Soweit ich weiß, geht das nicht.
    Du müsstest schon gegen die Datei linken und dann die main-funktion manuell aufrufen, das geht aber sowweit ich weiß nur mit shared-libraries (.so).
    IMHO sollte es aber kein Problem sein, wenn du dein auszuführendes Programm hernimmst und in eine .so kompiliertst, das einzige was du machen musst, ist die main-function umbenennen, sonst spinnt der Linker.
    Geändert von Lin728 (19-08-2017 um 21:23 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    wenn du nur einen befehl absetzen willst versuch mal exec() oder system()

    für system("echo -e \"\a\"") libstd.h includen...

    greetz

  4. #4
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53
    nein, wie schon gesagt möchte ich das manuell laden...

    ist es nicht irgendwie möglich mit fread in void* zu lesen?

    void *func();

    fopen...
    fread(&func, sizeof(???),?,File)
    fclose
    func()

    dann kommt allerdings immer "nicht aufgelöstes externes symbol"
    lass ich bei der definition die klammern weg, also
    void *func;

    kommt bei func() : ist keine funktion

    Irgendwie muss das doch gehn

    GreetZ
    Woolf
    Geändert von Woolf (17-11-2003 um 13:44 Uhr)
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

  5. #5
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Nöö...

    Nix wie ungut, aber der einzig vernünftige Weg führt dabei über einen Linker.
    Und ein Linker kann keine executables laden.

    Wenn das in einer DLL drinnen is, kannstas mit dlopen() aufmachen und den Funktionspointer auflösen...
    Geändert von Lin728 (19-08-2017 um 21:23 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53
    ja gut, ok, DLLs,

    dann sag mir mal wie dlopen im inneren aussieht *megagrins...*
    und hmmmm, mit assambler geht das ja, aber bin kein asm progger, könnte mir da jemand weiterhelfen? inlineassambly ^^
    ansonsten wirklich DLLs...

    oder sollte ich die objekte irgendwie parsen... hmmm
    wie machen die das in der UT engine mit den U files, nagut ok, wird warscheinlich nicht allein im C sein ^^? code oder parser?

    Mich interessiert das, möchte das nämlich auch so ähnlich machen...

    hmmm
    Code:
    void (*func)() = malloc(32768); //nehmen wir mal ein paar bytes...
    	FILE *File = NULL;
    
    	File = fopen("inprog.o", "r");
    	fread(func,sizeof(void*),1,File);
    	fclose(File);
    Das gibt keinen fehler aus...
    mit der klammer (*func)
    aber... wenn ich dann func() mach gibz nen fehler ^^
    vielleicht gehts ja doch, nur fread oder dateiinhalt is falsch...
    wobei inhalt der datei warscheinlicher is ^^ is... oder 100% sicher ^^

    *weiterprobier*

    also so klappts auch nicht..
    Code:
    	FILE *File = NULL;
    
    	File = fopen("inprog.x", "w");
    	fwrite(test, sizeof(&test), 1, File); // fix definiertes void *test(){printf...}
    	fclose(File);
    
    	File = fopen("inprog.o", "r");
    	fread(func,sizeof(&test),1,File);
    	fclose(File);
    
    	func();
    wegen "func();"

    irgendwie MUSS das gehn...

    GreetZ
    Geändert von Woolf (17-11-2003 um 15:10 Uhr)
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320

    So einfach ist das nicht

    Du kannst nicht einfach Objekte laden und ausführen. Wenn schon, musst du das Format der Objektdateien interpretieren und die Funktionen linken (Linken bedeutet, dass die Addressen angepasst werden). Aber: vergiss es!

    Wieso solltest du was implementieren was es bereits gibt? Und in Zukunft wird es immer weniger die Möglichkeit geben, Speicher auszuführen. Ein Speichersegment sollte entweder lesbar und schreibar sein, oder lesbar und ausführbar.

    Was du suchst - so wie ich das sehe - sind dyamischer linkbare Module. Und zwar nicht Shared objekte (.so), sondern sogenannte Plugins, wie sie oft verwendet werden. Unter Linux gibt es dafür den dlopen Mechanismus. Ich empfehle dir jedoch Libtool einzusetzen (am besten zusammen mit autoconf und automake, weil das am einfachsten ist). Dieses abstrahiert viele Aufrufe, so dass es portabel ist und meist auch einfacher.

    Mit diesem Plugin-System kannst du Symbole nachladen, die während der Kompilierzeit nicht bekannt sind, im Gegensatz zu Shared Objects.

    Gruss, Andy

  8. #8
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53
    grml keine objekte, jetz hab ich anderes problem

    wie find ich die größe raus von ner void?
    im irc hat jemand gesagt
    zb bei
    void *test()
    {
    printf("hallo");
    }

    soll ich
    char *func = new char[GRÖSSE von test(), nur wie bekomm ich die???]
    fputc

    und dann kann ich
    char *func = new char[größe...]
    fgetc
    machen und irgendwie ausführen mit nem jmp per inline asm oder so

    nur die größe fürs speichern...???

    GreetZ
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

  9. #9
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Adressen....

    Ein *Void hat immer die größe vom Prozessor-Adressbus. Ein sizeof(void*) sagt das dann eh. Eine Funktion selbst, nun, das ist platformspezifisch. Steht sicher in der ELF-Definition drinnen.

    Soweit ich weiß stehen bei Object-Dateien keine fixen Adressen drinnen (werden erst vom Linker eingetragen), bei Executables schon.
    Geändert von Lin728 (19-08-2017 um 21:24 Uhr)

  10. #10
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53
    nagut dann nehm ich coff files und lad die rein, da hab ich im irc schon hilfe gefunden

    GreetZ
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •