运行时更改静态变量的地址

时间:2018-01-28 00:19:50

标签: c linux memory gdb

我试图弄清楚为什么static uint64_t arr[]的地址在主要可执行文件中的全局范围内定义时会发生变化。 它在运行时从0x201060(由链接器定义?)更改为0x555555755060,我不明白为什么。

为什么会发生这种情况,有没有办法阻止这种行为?

我有一个预编译的二进制文件没有出现这种行为,我试图模仿它。

$ gdb a.out   # compiled from test.c
GNU gdb (GDB) 8.0.1...
Reading symbols from a.out...done.
(gdb) x/x arr
0x201060 <arr>: 0x00000024
(gdb) b main
Breakpoint 1 at 0x6e9: file test.c, line 116.
(gdb) run
Starting program: ... 
Breakpoint 1, main (argc=1, argv=0x7fffffffdb28) at test.c:116
116     if(argc != 2) {
(gdb) x/x arr
0x555555755060 <arr>:   0x00000024

test.c使用以下选项进行编译:{{1​​}}。

我编译并运行-g -fno-stack-protector -z execstack没有ASLR(test.c),但结果是一样的。

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'的相关部分是:

test.c

1 个答案:

答案 0 :(得分:1)

我明白了:)

事实证明我的gcc默认输出了PIE可执行文件,并且-no-pie完成了我需要的操作。我创建了数组static以试图保持地址相同,但我认为static仅在运行时期间保持地址相同

感谢Mark Plotnick在评论中提出的建议!