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中直接运行它有什么不同呢?为什么我直接运行时看到地址有所不同?
你的书很旧了。如今,许多操作系统都在加载程序和库的位置进行随机化,以使系统能够更安全地抵御某些攻击。
MacOS 随机化程序在内存中的加载位置。不过,它确实禁用了 gdb 的随机化,这就是为什么地址在 gdb 中看起来始终相同的原因。