Funktion ohne Stack Frame
-
Hallo,
ich würde gerne wissen, wie man mit dem GCC/MinGW eine Funktion ohne Stack Frame deklarieren kann. Auch bei einer einfachen Funktion wie folgender:
int foo() { }
wird ein Stack Frame generiert:
push ebp mov ebp, esp pop ebp ret
Würde mich freuen, wenn mir jemand sagen könnte, wie ich das unterdrücken kann. Habe dazu nämlich nichts gefunden.
-
such mal bei google nach '__attribute__(naked)'
-
Wenn ich der Funktion das Attribut `naked` gebe, bekomme ich das mit einer Warnung quittiert: "[Warning] `naked' attribute directive ignored". Die GCC-Dokumentation sagt folgendes:
naked
Use this attribute on the ARM, AVR, C4x and IP2K ports to indicate that the specified function does not need prologue/epilogue sequences generated by the compiler. It is up to the programmer to provide these sequences.Ich programmiere aber einen ganz normalen 386er und deshalb wird das Attribut bei mir wohl ignoriert, oder? Die anderen Attribute habe ich auch mal durchgeschaut, aber da scheint nichts Passendes dabei zu sein ... Kann der GCC auf einem 386er also keine `nackten` Funktionen erzeugen?
-
das geht nicht beim x86
oh mann, GCC ist echt der letzte schrott
-
Wie soll er das denn machen? Irgendwo muss die Ruecksprungadresse doch gespeichert werden...
-
SG1 schrieb:
Wie soll er das denn machen? Irgendwo muss die Ruecksprungadresse doch gespeichert werden...
und für was benötigt man sowas
-
SG1 schrieb:
Wie soll er das denn machen? Irgendwo muss die Ruecksprungadresse doch gespeichert werden...
die rücksprungadresse wandert schon beim 'call' auf den stack, dafür braucht man keinen stack frame.
codefrag schrieb:
und für was benötigt man sowas
z.b. für funktionen, die nur aus assembler-code bestehen, der das ebp-register benutzt, wenn man keine lokalen variablen braucht, wenn ebp durch die funktion nicht verändert werden darf usw.
@OP: vielleicht hat der GCC sowas wie 'force inline', dann legt er keine funktion und demzufolge auch keinen stack frame an.
oder du machst dir ein makro, das ist dann sogar portabel.
-
Es gibt doch die -fomit-frame-pointer Option, macht die nicht sowas?
-
vista schrieb:
@OP: vielleicht hat der GCC sowas wie 'force inline', dann legt er keine funktion und demzufolge auch keinen stack frame an.
oder du machst dir ein makro, das ist dann sogar portabel.
Eigentlich wollte ich aber schon, dass es im Kompilat noch funktionen sind, die aufgerufen werden müssen.
Bashar schrieb:
Es gibt doch die -fomit-frame-pointer Option, macht die nicht sowas?
Ja, die Option hat eigentlich den gewünschten Effekt. Nur gilt das dann leider für alle Funktionen des Programms. Eine Option für einzelne Funktionen, wie das Naked-Attribut, wäre natürlich praktischer, aber das geht wohl nicht.
Wie auch immer: Danke für eure Antworten!