2011-10-11 7 views
6

Perché quando eseguo il codice da gdb, ottengo gli stessi indirizzi per le variabili dichiarate, ma mentre eseguo il file binario non ottengo gli stessi indirizzi.Perché l'indirizzo di una variabile locale varia quando si esegue più volte, ma non quando si esegue il debugging con GDB?

#include<stdio.h> 
void main() 
{ 
    int *x,q; 
    //I saw the address of the variable q in this program through gdb during the __1st__ execution. 
    //I re-compiled the program to make x to point to this address. 
    x=0x7fffffffe2bc; 
    *x=3; 
    printf("%d",(*x)); 
} 

Ho eseguito il programma tramite gdb e mai Segfault.

$ gdb -q ./a.out 
Reading symbols from /home/eknath/needed2/a.out...done. 
(gdb) r 
Starting program: /home/eknath/needed2/a.out 
3 
Program exited normally. 
(gdb) q 
$ 

Tuttavia, l'esecuzione normale del programma produce sempre un SEGFAULT.

$ ./a.out 
Segmentation fault 

Non so se questa domanda è un duplicato di Is this always the address for GDB debug program?

NOTA: Non ho spento ASLR

risposta

2

Il motivo per cui si ottiene sempre lo stesso indirizzo per le variabili locali durante l'esecuzione in GDB è che GDB (per semplificare la maggior parte degli scenari di debug) disabilita la randomizzazione dello spazio degli indirizzi.

È possibile chiedere GDB a non farlo con set disable-address-randomization off.

Per curiosi, la disabilitazione di indirizzo randomizzazione per il processo corrente non non richiede alcun privilegio, ed è fatto chiamando personality(2). Ecco lo patch che ha aggiunto questa funzione.

+0

Great Answer, grazie –

0

EDIT: Vorrei chiarire il mio punto in quanto non può essere stato chiaro . GDB disabilita di default ASLR in modo che le variabili abbiano sempre lo stesso indirizzo (a meno che il codice non cambi, aggiungendo variabili o codice prima o anche dopo, in alcuni casi possono causare spostamenti negli indirizzi assegnati e causare errori). In questo modo il tuo codice ha successo perché gli indirizzi hardcoded si troveranno nello stesso punto durante l'esecuzione in GDB. Questo aiuta nel debug perché gli indirizzi non cambieranno dalla sessione di debug alla sessione di debug.

+0

Così efficacemente, gdb disattiva ASLR? –

+0

Sì e alcune altre cose, ma per la tua domanda ASLR è il bit importante. Inoltre, consente solo 2 thread simultanei (le versioni precedenti almeno non parlano di quelli più recenti) e presenta alcune altre limitazioni. –

+0

Ma non capisco come potrebbe farlo. Voglio dire ASLR può essere impostato/disattivato solo tramite sysctls o altri mezzi privilegiati, giusto? In che modo gdb, senza privilegi di root o setuid, riesce a farlo? –

Problemi correlati