2015-08-03 31 views
5

setjmp'un en azından x86_64 linux'unda ne yaptığını merak ettim, bu yüzden glibc 'un kaynak kodunu aradım ancak kayıt kurtarmanın nerede yapıldığını gerçekten bulamıyorum. Burada neler olduğunu açıklar mısınız?glibc'nin setjmp kodu nerede?

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

Sanırım platforma özel dizinlerden birinde derleme olarak yazılmıştır. Glibc üzerinden bir debeugger ile tek adım atmayı ve hangi kaynak dosyalarını vurduğunuzu gözlemlediniz mi? – fuz

+0

Derleyici içinde dahili olarak yapılabilir. – Barmar

+2

x86_64 kaynağı [burada bulunur] olabilir (https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/setjmp.S;h=774aaf1e8d9c918162a88cb1141fe4737969c4af;hb=HEAD) . Mecliste yazılmıştır. Bir dizini "yukarı" taşırsanız, diğer platformlar için de kaynağı bulabilirsiniz. –

cevap

4

setjmp_setjmp çağıran bir makrodur. X86_64 mimarisi için ../sysdeps/x86_64/bsd-_setjmp.S'da tanımlanmıştır. _setjmp, ../sysdeps/x86_64/setjmp.S'da tanımlanan __sigsetjmp; Bu işlev kesinlikle platform bağımlıdır ve montajda uygulanması gerekir.