我有一个程序,其中argv [0]会不时被覆盖。这种情况(仅)在生产机器上发生,我无法访问,也无法使用调试器。为了找到这种腐败的根源,我想写保护这个堆栈页面,这样任何写访问都会被转为错误,我可以得到罪魁祸首指令的地址。
系统是基于AIX 5.3 64位的。当我尝试在我的堆栈页面上调用mprotect时,我收到ENOMEM错误。我正在使用gcc生成我的程序。
在Linux系统(基于x86)上,我可以毫无困难地使用mprotect设置类似的保护。
有没有办法在AIX上实现这一点。或者这是一次毫无希望的尝试?
答案 0 :(得分:0)
在AIX上,mprotect()
要求所请求的页面仅为共享内存或内存映射文件。在AIX 6.1 and later上,您可以使用MPROTECT_TXT
环境变量将其扩展到文本区域,共享库等。
但是,您可以在XLC 11 / AIX 6.1TL4及更高版本上使用-qstackprotect
option。 " Stack Smashing Protection"旨在防范您所描述的情况。
在AIX 5.3上,我唯一的建议是使用像Parasoft's Insure++这样的工具集来构建。它会在运行时找到错误的写入堆栈。它几乎是AIX开发业务中最好的(现在也是唯一的)工具。我们在内部使用它,并在您需要它时非常宝贵。
答案 1 :(得分:0)
对于记录,此问题的解决方法是将处理移至pthread线程。在AIX上,pthread线程堆栈存在于可以被保护的数据段中(与原始线程相反,它不能被保护)。这是AIX上的JVM(OpenJDK)实现堆栈保护的方式。