setjmp() dovrebbe salvare i registri tra cui "indirizzo di ritorno" e "puntatore dello stack" in "jmp_buf". Quando compilo (sia gcc che clang) e eseguo il debug del seguente programma sotto x86_64 con glibc, non riesco a capire cosa c'è nel "jmp_buf" e dove "indirizzo di ritorno" e "puntatore dello stack" si trovano nel "jmp_buf".Quali sono le cose reali nel jmp_buf quando si usa setjmp e longjmp?
#include <stdio.h>
#include <setjmp.h>
int main()
{
int i;
jmp_buf env;
i = setjmp(env);
printf("i = %d\n", i);
if (i != 0) return;
longjmp(env, 2);
printf("Does this line get printed?\n");
}
Quando il programma si ferma a un punto di interruzione prima di "printf (" i =% d \ n "i);", ho provato funzionalità gdb: "p/x env"; tuttavia non riesco a trovare "return RIP" e "previous RSP" in questa struttura (env) che contiene __jmpbuf e __saved_mask. Qualcuno sa esattamente come funzionano queste due funzioni e cosa salvano esattamente sotto x86_64 con glibc (io uso Ubuntu 14.04)?
Ho visto diverse domande come questa in stackoverflow.com, ma le risposte sono in genere "Dipende dall'architettura, dal sistema operativo, dalla libreria e dall'ABI ..." o incollare lo standard. Non sono quello che mi piacerebbe sapere. – WindChaser
Perché non guardi l'implementazione sulla tua piattaforma? È open source. Ad esempio: https://github.com/lattera/glibc/blob/master/sysdeps/sh/____longjmp_chk.S - questo è ciò che longjmp chiama in glibc. –