【发布时间】:2014-02-23 18:02:01
【问题描述】:
看看这个主要的:
int
main()
{
int asd = 10;
printf("%p\n", &asd);
return 0;
}
asd 在给定时刻的地址:
0x7ffff5f7c16c
主要地址(始终相同):
(gdb) disass main
Dump of assembler code for function main:
0x00000000004005b4 <+0>: push %rbp
为什么普通c程序的变量地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置独立的)? 我看到地址可变性是由于 ASLR 模式造成的,但为什么它只影响程序变量,而不影响代码分配的位置?这是否与以下事实有关,即作为代码部分 ro,在非严格必要时将其随机化是没有意义的?
另外,为什么main的tarting地址和变量asd的地址差距这么大?
【问题讨论】:
-
问题是一样的,但我正在寻找的是略有不同。我想知道为什么文本部分和堆栈之间存在这种差异,可能是什么原因(如果有的话),而不是为什么会发生这种情况。
标签: linux debugging gcc assembly memory-address