2016-06-10 3 views
-1

GCC (ich verwende GCC-4.8.5) hat die Konzepte von prelogue und epilogue, die verwendet werden, um Codes am Anfang und Ende zu generieren jede Funktion. Ich frage mich, wie ich meinen eigenen Code in Prälogue und Epilog einfügen kann. Ich habe versucht, "prologue/epilogue" im gcc-Quellcode zu suchen, habe aber immer noch keine Ahnung (ich bin neu im Compiler). Kann mir jemand sagen, wie ich das im Detail erreichen soll (z. B. welche Funktion in gcc soll ich suchen usw.)?Wie man meinen eigenen Code am Anfang/Ende jeder Funktion mit GCC

BTW, fragte jemand eine ähnliche Frage here, aber die Antworten dort waren nicht hilfreich.

+0

Der "Prolog" und der "Epilog" sind Ihre Standard-Tabellenkalkulation. Der Link, den Sie aufgelistet haben, sieht so aus, als würde er versuchen, GCC selbst zu modifizieren. Definitiv nicht zu empfehlen. –

+3

['-Finstrument-Funktionen'] (https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html) ist, was Sie suchen. –

+0

Danke! Aber ich möchte den Stack einer Funktion manipulieren, bevor diese Funktion existiert. Wenn ich -finstrument-Funktionen verwende, kann ich nicht auf den Stack des Aufrufers innerhalb von __cyg_profile_func_exit() zugreifen. Hab ich recht? –

Antwort

0

Es hängt davon ab, was Sie genau machen wollen. Anstatt den Compiler zu ändern, was eine komplizierte Aufgabe ist, können Sie Asm-Code vor dem Funktionsaufruf oder in Ihrer Funktion einfügen, um den vom Compiler implementierten Aufrufmechanismus zu manipulieren. Oder Sie verwenden asm-Code, um Ihre Funktion aufzurufen, anstatt die Standardsyntax zu verwenden. Ich erinnere mich, dass ich irgendwo darüber gelesen habe. Ich denke, es war einer der Artikel von osdev.org.

+0

Eigentlich möchte ich den Stapel jeder Funktion manipulieren, bevor sie zurückkehrt (z. B. den Inhalt des Stapels ausdrucken). Ja, dies kann erreicht werden, indem am Ende jeder Funktion ein paar Zeilen Code hinzugefügt werden. Aber es ist nicht möglich für ein großes Projekt, das aus hunderttausenden von Funktionen bestehen könnte (z. B. Linux-Kernel). Daher suche ich nach einem Ansatz, um es automatisch zu machen. –

0

Definieren Sie eine neue ret-Funktion und rufen Sie sie in Ihren Funktionen mit return ret(); auf. In dieser neuen ret-Funktion lade den Stapel ab.

Verwandte Themen