Irix > Programmieren, Kompilieren

Runtime Code Generation?

<< < (2/5) > >>

majix:
So, mal ein kleines Update zu dem Problem: Da ich ja eigentlich ziemlich einfache Programme ohne Sprünge und schleifen erzeugen will, kann ich das eigentlich auch selber machen. Es handel sich ja eigentlich nur um eine Folge von Funktionsaufrufen, das sollte nicht allzu schwierig oder aufwändig werden.

Das muss ich dann zwar für jede Plattform neu machen, aber der Aufwand sollte relativ klein sein. Und als Kompatibiltätsmodus kann ich ja immer noch mein altes System verwenden.

Grüße,
Kaya

sgt_barnes:

--- Zitat ---An den Ansatz habe ich auch gedacht - ist auf jeden Fall gangbar, allerdings setzt das dann immer eine vollständige C++-Installation auf Anwenderseite voraus.
--- Ende Zitat ---


Hm, das stimmt natürlich! Browser-Plugins werden nunmal schon binär ausgeliefert und nicht beim Anwender kompiliert...


--- Zitat --- Da ich ja eigentlich ziemlich einfache Programme ohne Sprünge und schleifen erzeugen will, kann ich das eigentlich auch selber machen. Es handel sich ja eigentlich nur um eine Folge von Funktionsaufrufen, das sollte nicht allzu schwierig oder aufwändig werden.

Das muss ich dann zwar für jede Plattform neu machen, aber der Aufwand sollte relativ klein sein. Und als Kompatibiltätsmodus kann ich ja immer noch mein altes System verwenden.
--- Ende Zitat ---


Wenn Du das richtig anstellst, so mit Parser und abstraktem Syntaxbaum und so wie in der Compilerbau-Vorlesung, brauchst Du nur die Code-Generierung portieren. Und die braucht ja dann auch nur einen Stack zusammenbauen und eine Funktion nach der anderen aufrufen. Und für den Rest gibt es Yacc und Bison.

Das grösste Problem dürfte in dem Zusammenhang werden, den genrierten Code zu laden und dann zu linken (Du musst ja wissen, wo Du hinspringen musst).

Dieses dyninst-Projekt kling vielversprechend, das sollte man sich wohl auch mal genauer angucken. Aber die frickeln wohl eher Code in schon kompilierte Programme, um zum Beispiel einen Callstack ausgeben zu können, wenn die Applikation crasht. Könnte trotzdem interessant für Dich sein.

MfG,
Tilmann

majix:

--- Zitat ---
Das grösste Problem dürfte in dem Zusammenhang werden, den genrierten Code zu laden und dann zu linken (Du musst ja wissen, wo Du hinspringen musst).

--- Ende Zitat ---

Ich habe mir jetzt was relativ einfaches einfallen lassen, da werde ich diese Probleme elegant umgehen. Ich habe mir eine Klasse gebastelt ("Assembler"), in die ich die zu erzuegenden Call-Befehle über Methoden einfüge - als Parameter übergibt man einfach den Zeiger auf die aufzurufende Funktion, plus Prameter - damit entfällt das Linken. Daraus muss ich jetzt nur noch die x86 Opcodes in einem Speicherblock generieren, und dann sollte ich ja direkt in diesen Speicherblock reinspringen können (über einen Funktionspointer auf diesen Speicherblock).


--- Zitat ---
Dieses dyninst-Projekt kling vielversprechend, das sollte man sich wohl auch mal genauer angucken. Aber die frickeln wohl eher Code in schon kompilierte Programme, um zum Beispiel einen Callstack ausgeben zu können, wenn die Applikation crasht. Könnte trotzdem interessant für Dich sein.

--- Ende Zitat ---

Ist schon interessant, aber wie Du selber sagst, der Schwerpunkt liegt auf dem Modifizieren bereits laufender Programme.

Ich habe noch ein wenig gegoogelt, auch sehr Interessant ist vcode http://www.pdos.lcs.mit.edu/~engler/pldi96-abstract.html. Aber wie gesagt, ich denke ich habe eine ganz nette Lösung gefunden, ich muss sie nur noch fertig stellen, aber das sollte relativ schnell gehen. Bei Interesse kann ich ja mal ein paar Details posten.

Grüße,
Kaya

sgt_barnes:

--- Zitat ---Bei Interesse kann ich ja mal ein paar Details posten.
--- Ende Zitat ---


Klar, lass sehen sobald Du was hast! :D

Schönes Wochenende,
Tilmann

majix:
So, ich habe gesiegt :) Ich habe mir einen winzig-Assembler geschrieben, mit dem ich simple Folgen von Call-Statements erzeugen kann.

Auf das wesentliche gebracht sieht das so aus, wobei es eine Programm-Klasse gibt.


--- Code: ---
class Assembler  {
private:
     ...
public:
     void  clear();
     void finish();

     Program* compile();

     void asmCall(void (__stdcall *)());

     template<typename P1>      
     void asmCall(void (__stdcall *adr)(P1), P1 p1);

     template<typename P1, typename P2>
     void asmCall(void (__stdcall *adr)(P1 ,P2 ), P1 p1, P2 p2);

     void asmReturn();
};

--- Ende Code ---


Als ein kleines (nicht direkt lauffähiges) Programm zum Download habe ich ein kleines ZIP erstellt:

http://obsolete.majix.org/mood/assembler.zip

Durch relativ kleine Änderungen (Container-Klassen und namespaces) sollte man das auch in eigenen Projekten verwenden können. Compiliert unter VC++ 6.0, ich weiß nicht wie es mit GCC aussieht, denn die Templates haben auch mal wieder etwas gebraucht, bis VC++ sie gefressen hat.

Grüße,
Kaya

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln