如何禁用Linux上的二进制地址空间随机化?

我正在开发并行程序的运行时系统,它可以利用跨多个进程的公共地址空间布局,可能遍布数千个节点。 很多时候,为这个环境构build的软件是在默认情况下启用了地址空间随机化的Linux系统上运行的,用户可能不希望或者不能在系统范围内禁用它(通过sysctl -w kernel.randomize_va_space=0等) 。 这对并行程序施加了一些限制,并且可能会损害性能。 因此,我们想弄清楚如何为我们构build的二进制文件禁用它。 安全性不是问题,因为此软件始终在受控环境中运行。

我已经find各种标志和variables的引用,如ET_EXECEF_AS_NO_RANDOM (显然从来没有合并过?)和PF_RANDOMIZE ,但我找不到任何文件,描述我可以做什么来设置这些标志。 一个理想的答案会告诉我什么编译器/汇编器/链接器标志将会禁用随机化生成的二进制文件,以及工作链/内核的工作版本。 下一个最好的将是一个工具,做一个二进制之后build立相同。

因为我确定有人会提出这个build议,所以我已经意识到我们可以在运行时用setarch -R做这个改变,但是最好把它logging在可执行文件中。

它看起来像paxctl -rx应该做的伎俩,但它似乎并不适用于内核中使用的当前方法,不包括PaX修补程序。

Solutions Collecting From Web of "如何禁用Linux上的二进制地址空间随机化?"

大概你有一些在节点上调用你的并行程序的守护进程。 如果是这样,你可以使这个通用的父节点禁用它创建的任何子进程的ASLR。

看看GDB的资源(7.0或CVS头)如何做到这一点。 它的要点是在fork之后和exec之前调用personality(orig_personality|ADDR_NO_RANDOMIZE)

是否有某些原因不能映射共享内存空间或使用命名的FIFO ?

Linux内核中的至少一些早期版本的ASLR在分叉时保留了偏移量 。 您可以简单地将它们安排在父/子流程层次结构中,而不是为您的流程禁用随机化,而是将父层/子层流程层次结构安排在相同父层派生的二进制文件的实例之间,使偏移保持不变?