2015-08-03 7 views
5

Ich war daran interessiert, was genau setjmp tut zumindest in x86_64 Linux, also habe ich durch glibc 's Quellcode gesucht, aber ich kann nicht wirklich finden, wo das Register gespeichert wird. Kannst du erklären, was hier vor sich geht?Wo ist glibcs ​​Code für setjmp?

setjmp.h

extern int _setjmp (struct __jmp_buf_tag __env[1]) __THROWNL; 
#define setjmp(env)  _setjmp (env) 

BSD-_setjmp.c

int 
_setjmp (jmp_buf env) 
{ 
    return __sigsetjmp (env, 0); 
} 

libc_hidden_def (_setjmp) 

setjmp.c

int 
__libc_sigsetjmp (jmp_buf env, int savemask) 
{ 
    __sigjmp_save (env, savemask); 
    __set_errno (ENOSYS); 
    return 0; 
} 

weak_alias (__libc_sigsetjmp, __sigsetjmp) 
stub_warning (__sigsetjmp) 

sigjmp.c

int 
__sigjmp_save (sigjmp_buf env, int savemask) 
{ 
    env[0].__mask_was_saved = (savemask && 
          __sigprocmask (SIG_BLOCK, (sigset_t *) NULL, 
              &env[0].__saved_mask) == 0); 
    return 0; 
} 
+2

Ich denke, es ist in Assembly in einem der plattformspezifischen Verzeichnisse geschrieben. Haben Sie versucht, mit einem Debugger Single-Stepping durch die Glibc zu machen und zu beobachten, welche Quelldateien Sie getroffen haben? – fuz

+0

Es kann intern innerhalb des Compilers getan werden. – Barmar

+2

Die Quelle x86_64 kann [hier] gefunden werden (https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/setjmp.s;h=774aaf1e8d9c918162a88cb1141fe4737969c4af;hb=HEAD) . Es ist in der Versammlung geschrieben. Wenn Sie ein Verzeichnis nach oben verschieben, können Sie auch die Quelle für andere Plattformen finden. –

Antwort

4

setjmp ist ein Makro, das _setjmp nennt. Für die x86_64-Architektur ist sie in ../sysdeps/x86_64/bsd-_setjmp.S definiert. _setjmp wird dann __sigsetjmp anrufen, definiert in ../sysdeps/x86_64/setjmp.S; Diese Funktion ist streng plattformabhängig und muss in der Assembly implementiert werden.