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