glibc的setjmp代码在哪里?

xiv*_*r77 5 c setjmp

我对setjmp至少在x86_64 linux中究竟做了什么感兴趣,所以我搜索了glibc源代码,但我无法真正找到寄存器保存的位置.你能解释一下这里发生了什么吗?

SETJMP.H

extern int _setjmp (struct __jmp_buf_tag __env[1]) __THROWNL;
#define setjmp(env)     _setjmp (env)
Run Code Online (Sandbox Code Playgroud)

BSD-_setjmp.c

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

libc_hidden_def (_setjmp)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

edm*_*dmz 5

setjmp是一个调用_setjmp. 对于 x86_64 架构,它在../sysdeps/x86_64/bsd-_setjmp.S. _setjmp然后将调用__sigsetjmp,定义于../sysdeps/x86_64/setjmp.S; 此功能严格依赖于平台,需要在汇编中实现。