我试图弄清楚为什么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
答案 0 :(得分:1)
我明白了:)
事实证明我的gcc
默认输出了PIE可执行文件,并且-no-pie
完成了我需要的操作。我创建了数组static
以试图保持地址相同,但我认为static
仅在运行时期间保持地址相同。
感谢Mark Plotnick在评论中提出的建议!