Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does the address of a local variable vary when executing multiple times, but not when debugging it with GDB?

Why is it that when running code from gdb, I get the same addresses for the variables declared, but while just executing the binary I don't get the same addresses.

#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));
}

I ran the program through gdb and it never Segfaulted.

$ 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  
$

But normal execution of the program always produces a SEGFAULT.

$ ./a.out   
Segmentation fault

I don't know if this question is a duplicate of Is this always the address for GDB debug program?

NOTE: I have not switched off ASLR

like image 781
Lelouch Lamperouge Avatar asked Oct 11 '11 01:10

Lelouch Lamperouge


1 Answers

The reason you always get the same address for local variables while running under GDB is that GDB (in order to simplify most debugging scenarios) disables address space randomization.

You can ask GDB to not do that with set disable-address-randomization off.

For curious, disabling of address randomization for the current process does not require any privilege, and is done by calling personality(2). Here is the patch that added this feature.

like image 106
Employed Russian Avatar answered Oct 12 '22 23:10

Employed Russian