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;
}
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
Derleyici içinde dahili olarak yapılabilir. – Barmar
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. –