地址随机化:c中静态变量的打印地址

use*_*791 5 c static virtual-memory

我正在阅读操作系统教科书,有一个例子验证系统是否支持虚拟地址,并说下面的程序每次都应该打印相同的结果.我看到我的macbook pro有些不同.

#include <stdio.h>

int var = 0;
int main(void)
{
  var += 1;
  printf("Address: %x, value: %d\n", &var, var);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当它运行时,我看到地址在某些字节中发生了变化(但不是所有字节):

./main
Address: e8c6018, value: 1
./main
Address: 9032018, value: 1
./main
Address: 1bc7018, value: 1
Run Code Online (Sandbox Code Playgroud)

当我在GDB中运行时,我总是看到1018:

(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19631) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19636) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19654) exited normally]
Run Code Online (Sandbox Code Playgroud)

那么在GDB中直接运行它有什么不同呢?为什么我直接运行时看到地址有所不同?

Art*_*Art 2

你的书很旧了。如今,许多操作系统都在加载程序和库的位置进行随机化,以使系统能够更安全地抵御某些攻击。

MacOS 随机化程序在内存中的加载位置。不过,它确实禁用了 gdb 的随机化,这就是为什么地址在 gdb 中看起来始终相同的原因。