GDB:对于不同硬件平台上的每个程序,函数地址是固定的还是动态的?

GDB: Is function address fixed or dynamic for every program on different hardware platform?

如果我们编写像 printf("%p\n", __builtin_return_address(0)); 这样的 C 代码,假设我们从客户的平台 得到结果 0xabcd 。然后,我们 运行 在我们的平台上 与 gdb 相同的程序,我们发现 0xabcd 映射到 sample_function(),这是同一个函数当他 运行 执行该程序时在客户的平台上?或者换句话说,对于同一个程序但不同的硬件平台,堆栈地址是固定的还是动态的?

为了防止某些攻击,例如缓冲区溢出,操作系统使用地址Space布局随机化(ASLR)。 ASLR 确保每次您 运行 一个程序时,地址将随机放置在虚拟地址 space 上。 在 Linux,它默认启用。您可以通过 运行ning

禁用它
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

然后,如果您想再次启用它,只需 运行

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

更多信息可以查看这篇文章How Effective is ASLR on Linux Systems?

另一方面,在 gdb 中默认禁用 ASLR 以简化调试。您可以 enable/disable 使用这些命令

set disable-randomization off
set disable-randomization on