linux - Ubuntu 16.10 在运行时随机化函数地址

标签 linux ubuntu gcc

我使用 -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/

相关文章:

c - 函数声明对于 C 编程来说是必不可少的吗?

mysql - 将所有 mysql 请求重定向到其他数据库服务器

linux - 将并行进程 bash 脚本输出重定向到单个日志文件

ubuntu - 使用 ubuntu CLI,任何替代 SCREEN 命令

unit-testing - 我在 ubuntu 上使用 selenium 进行测试。在隐形工作区中测试

c++ - 试图了解 GCC 错误

gcc - 有没有办法从我不使用的目标文件中删除所有函数?

python - 通过 1 台计算机生成最大 wifi 事件

c - 内存对齐与 CPU 利用率

c++ - EOS CDT : where are the *. h 和文件系统中存储的 *.cpp 文件,我需要引用它们来编译