17

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

我找到了对各种标志和变量的引用,例如ET_EXEC, EF_AS_NO_RANDOM(显然从未合并?)和PF_RANDOMIZE,但我找不到任何描述我可以做些什么来设置这些标志的文档。一个理想的答案会告诉我哪个编译器/汇编器/链接器标志将禁用生成的二进制文件的随机化,以及它适用于哪些版本的工具链/内核。下一个最好的工具是在构建二进制文件后执行相同的操作。

由于我确信有人会建议它,我已经知道我们可以在运行时使用 进行此更改setarch -R,但最好将其记录在可执行文件中。

它看起来paxctl -rx应该可以解决问题,但它似乎不适用于不包含 PaX 补丁的内核中使用的当前方法。

4

3 回答 3

14

大概你有某种守护进程调用节点上的并行程序。如果是这样,您可以让这个公共父进程为它创建的任何子进程禁用 ASLR。

查看 GDB 源代码(7.0 或 CVS Head)以了解如何执行此操作。它的要点是调用personality(orig_personality|ADDR_NO_RANDOMIZE)afterfork和 before exec

于 2009-09-22T15:02:19.890 回答
1

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

于 2009-09-21T18:09:24.570 回答
0

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

于 2009-09-21T18:12:06.807 回答