簡體   English   中英

glibc的setjmp代碼在哪里?

[英]Where is glibc's code for setjmp?

我對至少在x86_64 linux中究竟是什么setjmp感興趣,所以我搜索了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定義; 此功能嚴格依賴於平台,需要在匯編中實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM