为什么全局变量的地址在多次运行中本地变化时不会改变?

时间:2015-09-03 14:26:48

标签: c operating-system loader memory-layout

我在同一台机器上多次运行此程序。

#include <stdio.h>

int a = 0;
int main() {
  int b = 0;
  printf("%p %p\n", &a, &b);
}
  1. 每次打印变量a的相同地址,但对于b,它会更改。我知道a会进入.data部分,所以地址是固定的(如果我错了,请纠正我)但为什么堆栈每次都会得到不同的地址?
  2. 所有这些地址都是虚拟的。是否可以从这些变量中获取物理地址?
  3. 如果全局变量初始化为零,它将去哪里,BSS还是数据?

1 个答案:

答案 0 :(得分:2)

  1. @JonathanLeffler已经提到堆栈地址因地址空间布局随机化而改变。
  2. 要使全局变量的地址发生变化,请使用-fpie编译可执行文件,并链接到-fpie -pie

    有关详细信息,请参阅Position Independent Executables (PIE)

    1. 无法从用户空间进行操作。即使您拥有在用户空间中没有多大用处的物理地址,因为它可能会因换出交换而发生变化。
      1. 通常零初始化数据进入BSS。