2015-01-21 15 views
5

setjmp() soll Register speichern, die "Rückkehradresse" und "Stapelzeiger" in "jmp_buf" enthalten. Wenn ich (sowohl gcc und clang) kompiliere und das folgende Programm unter x86_64 mit glibc debugge, kann ich nicht verstehen, was in "jmp_buf" ist und wo "return address" und "stack pointer" sich in "jmp_buf" befinden.Was sind die tatsächlichen Sachen im jmp_buf, wenn setjmp und longjmp verwendet werden?

#include <stdio.h> 
#include <setjmp.h> 

int main() 
{ 
    int i; 

    jmp_buf env; 

    i = setjmp(env); 

    printf("i = %d\n", i); 

    if (i != 0) return; 

    longjmp(env, 2); 
    printf("Does this line get printed?\n"); 
} 

Wenn das Programm an einem Haltepunkt stoppt, bevor "printf (" i =% d \ n "i);" habe ich versucht, GDB Funktionalität: "p/x env"; Allerdings kann ich in dieser Struktur (env), die __jmpbuf und __saved_mask enthält, nicht den "return RIP" und den "vorherigen RSP" finden. Jeder weiß, wie genau diese beiden Funktionen funktionieren und was genau sie unter x86_64 mit glibc speichern (ich benutze ubuntu 14.04)?

+0

Ich sah mehrere Fragen wie diese in stackoverflow.com, aber die Antworten sind in der Regel "Es hängt von der Architektur, Betriebssystem, Bibliothek und ABI ..." oder fügen Sie den Standard. Sie sind nicht das, was ich gerne wissen würde. – WindChaser

+1

Warum sehen Sie sich die Implementierung auf Ihrer Plattform nicht an? Es ist Open Source. Zum Beispiel: https://github.com/lattera/glibc/blob/master/sysdeps/sh/____longjmp_chk.S - so ruft longjmp in glibc auf. –

Antwort

7

Glauben Sie es oder nicht, der Inhalt von jmp_buf sind absichtlich bedeutungslos. Wenn Sie einen Blick auf the source to the x86_64 setjmp() werfen, werden Sie mehrere Verweise auf PTR_MANGLE bemerken. Dies ist ein internes Glibc-Makro, das einen fadenlokalen Wert für ein Register XOR-verknüpft. Dies wird hier zu einem großen Teil verwendet, um sicherzustellen, dass Entwickler sich nicht auf das Layout jmpbuf verlassen - es wird als Implementierungsdetail betrachtet und kann zwischen den Versionen von libc wechseln.

Wenn Sie etwas lesbares möchten, überprüfen Sie the ucontext interface.

+2

Ich glaube, Pointer Mangling wurde als Sicherheitsfunktion eingeführt, anstatt das Layout von jmpbuf zu verstecken. –

+0

@EmployedRussian Sie meinen, dass es einige Angriffe wie Stapelüberlauf verhindern kann? – WindChaser

+0

@WindChaser Dies ist der einzige relevante Link, den ich finden könnte: http://udrepper.livejournal.com/13393.html –

Verwandte Themen