【发布时间】:2018-01-20 19:11:15
【问题描述】:
我有如下小代码sn-p:
char global=100;
void main()
{
char p = NULL;
printf("%p\n", &p);
printf("%p\n", &global);
}
编译并生成二进制可执行映像后,每次执行相同的二进制可执行文件时,我都会看到局部变量p的不同虚拟内存地址。
但是,全局变量global的虚拟内存地址不变。
我了解 C 内存布局;我希望在每次使用相同的二进制图像执行时,给定变量的内存位置相同。
为局部变量分配的虚拟地址在运行时不同的原因可能是什么?
只有一个函数,没有机会改变函数的执行顺序,从而改变堆栈内存布局。
这个程序运行4次的结果:
0x7fff181b4b2f
0x601034
0x7ffe34abd62f
0x601034
0x7ffe2813b98f
0x601034
0x7fffcef6b52f
0x601034
【问题讨论】:
-
尝试暂时禁用 ASLR:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
标签: c memory-layout addressing