我使用 -finstrument-functions 来分析函数的进入和退出。在函数进入和退出时,我打印进入或退出的函数的地址(参数 func),然后使用 nm 将地址解析为符号名称转换。升级到Ubuntu 16.10后,我发现func参数的地址总是很高;正如文本部分所预期的那样,所有函数过去都靠近进程地址空间的开头。我查看了/proc/PID/maps,文本部分现在实际上从更高的地址开始,这很奇怪,因为它们的范围与 nm 显示的完全不同,因此直接翻译不再起作用。地址不仅要高得多,而且是随机的。而这一点,我很难理解:我理解出于安全原因随机化可写部分的地址,但文本部分不可写。无论如何,我的问题是关于文本部分的地址空间:知道 Ubuntu 16.10 上发生了什么吗?如何禁用此行为?
编辑:事实证明,Canonical 默认添加了位置无关的可执行文件支持到 GCC。我仍在寻找如何禁用此功能。
谢谢。
最佳答案
在 ChangeLog 的 GCC 部分下(可在此处找到:https://wiki.ubuntu.com/YakketyYak/ReleaseNotes)
“我们已将 GCC 修改为在 amd64 和 ppc64el 架构上默认编译具有位置独立可执行支持的程序,以提高地址空间布局随机化提供的安全优势。”
我阅读了 GCC 的手册页,要禁用此选项,只需添加 -no-pie。
关于linux - Ubuntu 16.10 在运行时随机化函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40511649/