[英]Where is glibc's code for setjmp?
I was interested in what exactly setjmp
does at least in x86_64 linux, so I searched through glibc
's source code, but I cannot really find where the register saving is done. 我对至少在x86_64 linux中究竟是什么
setjmp
感兴趣,所以我搜索了glibc
的源代码,但我无法真正找到寄存器保存的位置。 Could you explain what is going on here? 你能解释一下这里发生了什么吗?
setjmp.h SETJMP.H
extern int _setjmp (struct __jmp_buf_tag __env[1]) __THROWNL;
#define setjmp(env) _setjmp (env)
bsd-_setjmp.c BSD-_setjmp.c
int
_setjmp (jmp_buf env)
{
return __sigsetjmp (env, 0);
}
libc_hidden_def (_setjmp)
setjmp.c 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 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
is a macro which calls _setjmp
. setjmp
是一个调用_setjmp
的宏。 For the x86_64 architecture, it's defined in ../sysdeps/x86_64/bsd-_setjmp.S
. 对于x86_64体系结构,它在
../sysdeps/x86_64/bsd-_setjmp.S
定义。 _setjmp
will then call __sigsetjmp
, defined in ../sysdeps/x86_64/setjmp.S
; 然后
_setjmp
将调用__sigsetjmp
,在../sysdeps/x86_64/setjmp.S
定义; this function is strictly platform dependent and needs to be implemented in assembly. 此功能严格依赖于平台,需要在汇编中实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.