我正在为并行程序开发一个运行时系统,它可以利用跨多个进程的公共(public)地址空间布局,可能分布在几个(千)个节点上。很多时候,为此环境构建的软件在默认启用地址空间随机化的 Linux 系统上运行,用户可能不希望或无法在系统范围内禁用它(通过 sysctl -w kernel.randomize_va_space=0
等)。这对并行程序施加了一些限制,并且会损害性能。因此,我们想弄清楚如何为我们构建的二进制文件禁用它。安全性不是问题,因为该软件始终在受控环境中运行。
我找到了对各种标志和变量的引用,例如 ET_EXEC
、EF_AS_NO_RANDOM
(显然从未合并过?)和 PF_RANDOMIZE
,但我找不到任何描述我可以做什么来设置这些标志的文档。一个理想的答案是告诉我什么编译器/汇编器/链接器标志将禁用生成的二进制文件的随机化,以及它适用于哪些版本的工具链/内核。其次最好的是在构建二进制文件后执行相同操作的工具。
因为我确定有人会建议,我已经知道我们可以在运行时使用 setarch -R
进行此更改,但最好将此记录在可执行文件中。
看起来 paxctl -rx
应该可以解决问题,但它似乎不适用于不包含 PaX 补丁的内核中使用的当前方法。
请您参考如下方法:
假设您有某种守护进程可以在节点上调用您的并行程序。如果是这样,您可以让这个公共(public)父进程对其创建的任何子进程禁用 ASLR。
查看 GDB 源代码(7.0 或 CVS Head)以了解如何执行此操作。它的要点是在 fork
之后和 exec
之前调用 personality(orig_personality|ADDR_NO_RANDOMIZE)
。