Ich muss eine Funktion in C aufrufen, nur wissen, Adresse, und keine Informationen auf es Prototyp (ich kann es nicht auf einen C-Funktionszeiger werfen).Call-C-Adresse als Funktion ohne Prototyp
Die Information, die ich über diese Funktion habe, ist die Adresse.
Ich kenne auch die Parameter, die ich übergeben möchte (Dank eines void-Zeigers) und die Größe des arguments array (zugegriffen durch den void-Zeiger).
Ich möchte auch die C-Aufruf Konvention einhalten. Für x86-Version, ich ziemlich viel wissen, wie es geht (zuteilen Sie den Platz auf dem Stapel, kopieren Sie die Parameter diesen Raum und schließlich rufen Sie die Funktion).
Das Problem ist mit x64 Konvention (Linux für jetzt), wo die Parameter durch die Register übergeben werden. Ich habe keine Ahnung von der Größe der einzelnen Parameter zu füllen richtig registriert, ich kenne nur die Größe des Parameter-Array.
Auch ich möchte nicht auf gcc abhängen, so dass ich __builtin_apply nicht verwenden kann, scheint nicht Standard zu sein und auch ziemlich dunkel sein.
Ich möchte meinen eigenen Code schreiben, um Multi-Compiler und auch interessante Dinge zu lernen.
Also im Grunde die Funktion Ich möchte als den gleichen Prototyp wie __builtin_apply schreiben, das ist:
void *call_ptr(void (*fun)(), void *params, size_t size);
Ich mag auch den Code in C (dank asm inline) zu schreiben oder reinem x64 asm .
Also gibt es eine Möglichkeit, dies richtig und in Bezug auf die rufenden Konvention zu tun? Oder ist das mit der x64-Konvention unmöglich, ohne genau den Prototyp der Funktion zu nennen?
Werfen Sie einen Blick auf [libffi] (http://sourceware.org/libffi/). – tangrs
Dies könnte eine gute Alternative sein, aber das Problem mit libffi ist, dass es den Typ jedes Parameters und den Rückgabetyp der Funktion kennen muss. Ich möchte vermeiden, diese Informationen zu sammeln, um Zeitverlust zu vermeiden. Ist das mit x64-Architektur möglich? – Zerkan
@Zerkan nein es ist nicht, Sie brauchen die Arten der Parameter, es gibt keine Magie, die Parameter in den richtigen Registern oder Stapelplatz platzieren können, wenn eine Funktion ohne die Argumente zu wissen – nos