Adresse der aktuellen Anweisung für x86 erhalten [duplizieren]

8

Ich benutze Linux mit x86 (64 Bit um genau zu sein). Gibt es eine Möglichkeit, die Adresse der aktuellen Anweisung zu bekommen. Eigentlich möchte ich meine eigenen vereinfachten Versionen von setjmp / longjmp schreiben. Hier hat R. eine vereinfachte Version von longjmp gepostet. Irgendeine Idee, wie setjmp implementiert wird. Eine vereinfachte Version, die ohne Berücksichtigung von Ausnahmen und Signalen usw. ist ...

    
MetallicPriest 28.10.2011, 16:49
quelle

4 Antworten

24

Ich glaube an 64-Bit-Code kann man einfach lea rax, [rip] machen.

Das 32-Bit-Idiom ist:

%Vor%     
NPE 28.10.2011, 16:57
quelle
8

Wenn Sie GCC verwenden, können Sie auch __builtin_return_address verwenden.

    
Basile Starynkevitch 28.10.2011 17:17
quelle
4

Das Offset-in-das-aktuelle-Segment-Register ( EIP ) ist normalerweise nicht zugänglich. Es gibt jedoch einen indirekten Weg, um es indirekt zu lesen - Sie tricksen das Programm so, dass es den Wert von EIP auf den Stack überträgt, und lesen es dann einfach ab. Sie könnten eine Subroutine erstellen, die wie folgt aussieht:

%Vor%

Oder noch einfacher:

%Vor%

Wenn Sie eine Anweisung CALL FAR verwenden, wird der Segmentwert ( CS ) ebenfalls auf den Stapel geschoben.

Wenn Sie C verwenden, gibt es verschiedene Compiler-spezifische C-Erweiterungen, die Sie auf dieser Seite verwenden können. Siehe auch diesen interessanten Artikel .

    
quelle
0

Diese Website enthält eine einfache Version von setjmp und longjmp, die wie folgt aussieht .

%Vor%     
MetallicPriest 28.10.2011 17:08
quelle

Tags und Links