glibc中setjmp的代码在哪里?

6

我对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;
}

2
我认为它是在特定平台目录中用汇编语言编写的。你尝试使用调试器逐步执行glibc并观察你访问了哪些源文件了吗? - fuz
它可能在编译器内部完成。 - Barmar
2
x86_64源代码可以在此处找到:https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/setjmp.S;h=774aaf1e8d9c918162a88cb1141fe4737969c4af;hb=HEAD。它是用汇编语言编写的。如果您向“上”移动一个目录,您也可以找到其他平台的源代码。 - P.P
1个回答

5

setjmp是一个调用_setjmp的宏。对于x86_64架构,它在../sysdeps/x86_64/bsd-_setjmp.S中定义。 _setjmp然后会调用__sigsetjmp,该函数在../sysdeps/x86_64/setjmp.S中定义;这个函数严格地依赖于平台,并需要用汇编语言实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接