PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien ausführen



Woolf
16-11-2003, 21:24
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

Lin728
16-11-2003, 22:19
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.

quinte17
17-11-2003, 12:13
wenn du nur einen befehl absetzen willst versuch mal exec() oder system()

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

greetz

Woolf
17-11-2003, 13:40
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

Lin728
17-11-2003, 14:02
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...

Woolf
17-11-2003, 14:57
ja gut, ok, DLLs,

dann sag mir mal wie dlopen im inneren aussieht :D *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

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..

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

RapidMax
17-11-2003, 15:43
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

Woolf
17-11-2003, 16:04
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

Lin728
17-11-2003, 17:25
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.

Woolf
17-11-2003, 20:44
nagut dann nehm ich coff files und lad die rein, da hab ich im irc schon hilfe gefunden :)

GreetZ