Ich war daran interessiert, was genau setjmp
tut zumindest in x86_64 Linux, also habe ich durch glibc
's Quellcode gesucht, aber ich kann nicht wirklich finden, wo das Register gespeichert wird. Kannst du erklären, was hier vor sich geht?Wo ist glibcs Code für 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;
}
Ich denke, es ist in Assembly in einem der plattformspezifischen Verzeichnisse geschrieben. Haben Sie versucht, mit einem Debugger Single-Stepping durch die Glibc zu machen und zu beobachten, welche Quelldateien Sie getroffen haben? – fuz
Es kann intern innerhalb des Compilers getan werden. – Barmar
Die Quelle x86_64 kann [hier] gefunden werden (https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86_64/setjmp.s;h=774aaf1e8d9c918162a88cb1141fe4737969c4af;hb=HEAD) . Es ist in der Versammlung geschrieben. Wenn Sie ein Verzeichnis nach oben verschieben, können Sie auch die Quelle für andere Plattformen finden. –