Issue
I have this program:
double t;
main() {
}
On Ubuntu, I run:
% gdb a.out
(gdb) p &t
$1 = (double *) 0x4010 <t>
(gdb) run
Starting program: /home/phan/a.out
[Inferior 1 (process 95930) exited normally]
(gdb) p &t
$2 = (double *) 0x555555558010 <t>
Why did the address change from 0x4010 to 0x555555558010. Is there someway to prevent this? On Redhat, it doesn't do that:
% gdb a.out
(gdb) p &t
$1 = (double *) 0x601038 <t>
(gdb) r
Starting program: /home/phan/a.out
[Inferior 1 (process 23337) exited normally]
(gdb) p &t
$2 = (double *) 0x601038 <t>
BTW, this only occurs in Ubuntu 18.04. In Ubuntu 16.04, it works exactly as Redhat, ie the address is the same before and after.
Solution
You are presumably seeing pre and post-relocation addresses for the .bss
segment.
You can avoid this by disabling position independent executables, thus making gcc
choose the final address of the .bss
register up front:
gcc -no-pie foo.c
-static
would have the effect.
I don't know why there'd be a difference between Ubuntu and Redhat though.
Answered By - that other guy Answer Checked By - David Goodson (WPSolving Volunteer)