2015-01-21 8 views
5

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)?

+0

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

+1

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. –

risposta

7

Credici o no, il contenuto di jmp_buf è intenzionalmente senza significato. Se dai un'occhiata a the source to the x86_64 setjmp(), noterai diversi riferimenti a PTR_MANGLE. Questa è una macro glibc interna che XORs un valore locale del thread rispetto a un registro. Questo è usato qui in gran parte per garantire che gli sviluppatori non facciano affidamento sul layout di jmpbuf - è considerato un dettaglio di implementazione e può cambiare tra le versioni di libc.

Se si desidera qualcosa di leggibile, controllare the ucontext interface.

+2

Credo che il mangling dei puntatori sia stato introdotto come caratteristica di sicurezza piuttosto che nascondere il layout di jmpbuf. –

+0

@EmployedRussian Vuoi dire che può prevenire alcuni attacchi come lo stack overflow? – WindChaser

+0

@WindChaser Questo è l'unico collegamento rilevante che ho trovato: http://udrepper.livejournal.com/13393.html –

Problemi correlati