gpt4 book ai didi

c - 静态变量的地址在运行时改变

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:25 25 4
gpt4 key购买 nike

我试图弄清楚为什么 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 使用以下选项编译:-g -fno-stack-protector -z execstack

我在没有 ASLR 的情况下编译并运行了 test.c (sudo bash -c 'echo 0 >/proc/sys/kernel/randomize_va_space'),但结果是一样。

test.c的相关部分是:

#include <stdint.h>

extern int func(uint64_t[]);

static uint64_t arr[] = {
0x00000024, 0x00201060,
0x00201080, 0x00000000,
0x00000008, 0x002010e0,
0x002010a0, 0x00000000,
0x00000032, 0x002010c0,
...
0x00201100, 0x00000000
};


int main(int argc, char** argv) {
func(arr);
return 0;
}

最佳答案

我想通了:)

事实证明我的 gcc 默认输出 PIE 可执行文件,传递 -no-pie 做了我需要的。我制作了数组 static 以试图保持地址相同,但我认为 static 仅在 运行时保持地址相同。

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

关于c - 静态变量的地址在运行时改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com