我正在为并行程序开发一个运行时系统,该程序可以利用跨多个进程的公共地址空间布局,并有可能分布在多个(千个)节点上。很多时候,为此环境构建的软件在默认情况下启用了地址空间随机化的Linux系统上运行,用户可能不希望或无法在系统范围内(通过sysctl -w kernel.randomize_va_space=0
等)禁用它。这对并行程序施加了一些限制,并可能损害性能。因此,我们想弄清楚如何针对我们构建的二进制文件禁用它。安全性不是问题,因为此软件始终在受控环境中运行。
我找到了对各种标志和变量的引用,例如ET_EXEC
,EF_AS_NO_RANDOM
(显然从未合并?)和PF_RANDOMIZE
,但是找不到任何描述我可以设置这些标志的文档。一个理想的答案将告诉我,哪个编译器/汇编器/链接器标志将禁用所生成二进制文件的随机化,以及该工具可在哪些版本的工具链/内核中使用。下一个最好的工具是在构建二进制文件后执行相同操作的工具。
因为我确定有人会建议这样做,所以我已经知道我们可以在运行时使用进行更改setarch -R
,但最好将其记录在可执行文件中。
看起来paxctl -rx
应该可以解决问题,但是它似乎不适用于不包含PaX补丁的内核中使用的当前方法。
大概您有某种守护程序可以在节点上调用您的并行程序。如果是这样,则可以使此公共父级对其创建的任何子进程禁用ASLR。
在GDB来源(7.0或CVS
Head)中查找如何做到这一点。要旨是在personality(orig_personality|ADDR_NO_RANDOMIZE)
之后fork
和之前打电话exec
。
问题内容: 我正在尝试调试使用很多指针的二进制文件。有时为了快速查看输出以找出错误,我打印了对象的地址及其对应的值,但是对象地址是随机的,这违背了快速检查的目的。有没有一种方法可以暂时/永久禁用此功能,以便每次运行程序时都获得相同的值。 哎呀。操作系统是 问题答案: 在Ubuntu上,可以使用…禁用它。 在Windows上,这篇文章可能会有所帮助… http://blog.didiersteven
问题内容: 我想在我的系统(Ubuntu Gnu / Linux 2.6.32-41-server)上禁用地址空间布局随机化(ASLR),但是,如果使用 我认为,更改将影响系统上的所有用户。(这是真的吗?)如何将禁用ASLR的影响仅限于自己作为用户使用,或者仅限于在我调用该命令禁用的Shell会话中进行? 顺便说一句,我看到系统的当前(默认)设置是 为什么选择2,而不是1或3?在哪里可以找到有关/
问题内容: 我做错了(或没有做过)对我而言无法正常工作? 问题答案: 如果您使用的是Docker,则可能需要该选项(以及启用ptrace):
6.4.5 二进制文件与随机存取* 前面介绍的文件处理是针对文本文件的,并且主要是顺序存取文件。本节简单介绍二进 制文件的处理以及文件的随机存取。 二进制文件 任何文件在底层都是字节序列。文本文件的字节可解释成字符的编码:如果是 ASCII 编码,则每个字节表示一个字符;如果是 GBK 编码,则每两个字节表示一个汉字。对文本 文件的处理完全基于这种字符解释。而二进制文件的字节序列表示任意的二进制数
问题内容: 是否有可能编译项目在 32位 与和一对 64位 系统?可能是,但是我该怎么做呢? 当我以“无知”的方式尝试它时,没有设置任何参数/ flags / etc,只是设置在其中查找链接的库似乎忽略了它,而只查看名为 lib64的 子目录。 问题答案:
问题内容: 在运行Linux的基于ARM的系统上,我有一个将内存映射到物理地址的设备。从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容? 问题答案: 您可以使用系统调用将设备文件映射到用户进程内存。通常,设备文件是物理内存到文件系统的映射。否则,您必须编写一个内核模块来创建此类文件或提供一种将所需内存映射到用户进程的方法。 另一种方法是将/ dev / mem的部分重新映射到用户内存。 编