Memory 在AIX上写保护堆栈页?

Memory 在AIX上写保护堆栈页?,memory,aix,Memory,Aix,我有一个argv[0]不时被覆盖的程序。这种情况(仅)发生在我无法访问且无法使用调试器的生产机器上。为了找到这种损坏的根源,我想写保护这个堆栈页,这样任何写访问都会在出现错误时被打开,并且我可以得到罪魁祸首指令的地址 该系统是基于AIX5.3 64位的。当我试图在堆栈页面上调用mprotect时,我得到一个ENOMEM错误。我正在使用gcc生成我的程序 在Linux系统(基于x86)上,我可以使用mprotect设置类似的保护,而不会出现问题 有没有办法在AIX上实现这一点。还是这是一次毫无希望

我有一个argv[0]不时被覆盖的程序。这种情况(仅)发生在我无法访问且无法使用调试器的生产机器上。为了找到这种损坏的根源,我想写保护这个堆栈页,这样任何写访问都会在出现错误时被打开,并且我可以得到罪魁祸首指令的地址

该系统是基于AIX5.3 64位的。当我试图在堆栈页面上调用mprotect时,我得到一个ENOMEM错误。我正在使用gcc生成我的程序

在Linux系统(基于x86)上,我可以使用mprotect设置类似的保护,而不会出现问题

有没有办法在AIX上实现这一点。还是这是一次毫无希望的尝试

在AIX上,
mprotect()
要求请求的页面只能是共享内存或内存映射文件。在上,可以使用
MPROTECT\u TXT
环境变量将其扩展到文本区域、共享库等

但是,您可以在XLC 11/AIX6.1TL4和更高版本上使用。“堆叠破坏保护”旨在针对您描述的情况进行保护


在AIX5.3上,我唯一的建议是使用类似的工具集进行构建。它将在运行时定位对堆栈的错误写入。它几乎是AIX开发业务中最好的(现在也是唯一的)工具。我们在内部使用它,当您需要它时,它是非常宝贵的。

作为记录,解决这个问题的一个方法是将处理转移到pthread线程。在AIX上,pthread线程堆栈位于可以被保护的数据段中(与不能被保护的原始线程相反)。这就是AIX上的JVM(OpenJDK)实现堆栈保护的方式。

-鉴于您似乎被限制在已被mmap(以及其他一些内容)的页面上,我怀疑您是否可以更改堆栈保护模式。(但我对这一点不太熟悉,无法回答。)