glibc 的 setjmp 代码在哪里?
Where is glibc's code for setjmp?
我对 setjmp
到底做了什么感兴趣,至少在 x86_64 linux,所以我搜索了 glibc
的源代码,但我真的找不到寄存器保存完成的地方。你能解释一下这是怎么回事吗?
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;
}
setjmp
是调用 _setjmp
的宏。对于 x86_64 架构,它在 ../sysdeps/x86_64/bsd-_setjmp.S
中定义。 _setjmp
将调用 __sigsetjmp
,在 ../sysdeps/x86_64/setjmp.S
中定义;此功能严格依赖于平台,需要在汇编中实现。
我对 setjmp
到底做了什么感兴趣,至少在 x86_64 linux,所以我搜索了 glibc
的源代码,但我真的找不到寄存器保存完成的地方。你能解释一下这是怎么回事吗?
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;
}
setjmp
是调用 _setjmp
的宏。对于 x86_64 架构,它在 ../sysdeps/x86_64/bsd-_setjmp.S
中定义。 _setjmp
将调用 __sigsetjmp
,在 ../sysdeps/x86_64/setjmp.S
中定义;此功能严格依赖于平台,需要在汇编中实现。