2015-08-03 39 views
5

我對setjmp至少在x86_64 linux中有什麼感興趣,所以我通過glibc的源代碼進行搜索,但我無法真正找到註冊表保存的位置。你能解釋一下這裏發生了什麼嗎?glibc的setjmp代碼在哪裏?

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; 
} 
+2

我認爲它是用程序集編寫在一個特定於平臺的目錄中的。你是否嘗試過使用glibc與debeugger進行單步調試,並觀察你點擊的源文件? – fuz

+0

它可能在編譯器內部完成。 – Barmar

+2

x86_64源代碼可以[在這裏找到](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/setjmp.S;h=774aaf1e8d9c918162a88cb1141fe4737969c4af;hb=HEAD) 。它是用匯編寫的。如果您將某個目錄「向上」移動,您也可以找到其他平臺的源代碼。 –

回答

4
setjmp

是它調用_setjmp的宏。對於x86_64體系結構,它在../sysdeps/x86_64/bsd-_setjmp.S中定義。 _setjmp然後將呼叫__sigsetjmp,在../sysdeps/x86_64/setjmp.S中定義;此功能嚴格依賴於平臺,需要在彙編中實施。