在Java7上使用JNI运行Java5/6会发出堆栈保护警告
使用1.5(或1.6启用1.5可比性模式)构建的java程序发出以下警告: Java HotSpot(TM)服务器虚拟机警告:您已加载库 mynativelib.so可能已禁用堆栈保护在Java7上使用JNI运行Java5/6会发出堆栈保护警告,java,java-native-interface,guard,Java,Java Native Interface,Guard,使用1.5(或1.6启用1.5可比性模式)构建的java程序发出以下警告: Java HotSpot(TM)服务器虚拟机警告:您已加载库 mynativelib.so可能已禁用堆栈保护 VM现在将尝试修复堆栈保护。强烈建议您修复 带有'execstack-c'的库,或将其链接到'-z' noexecstack’ 这似乎不会引起问题,但对我们的客户来说显然会有点吓人。 我不认为在7中构建java位可以解决这个问题,但我很难看到文档中说如何为java 7构建JNI libs,这就是警告所暗示的,我应
VM现在将尝试修复堆栈保护。强烈建议您修复 带有'execstack-c'的库,或将其链接到'-z' noexecstack’ 这似乎不会引起问题,但对我们的客户来说显然会有点吓人。 我不认为在7中构建java位可以解决这个问题,但我很难看到文档中说如何为java 7构建JNI libs,这就是警告所暗示的,我应该采取不同的做法 那么我应该去哪里寻找呢?在这里找到了答案 他说 这是Java 7在Linux上的HotSpot编译器中的一个特性,它试图阻止用C编写并链接到Java(所谓的Java本机接口-JNI)的代码在编写错误或恶意时停止整个VM
另一种可能性是,您尝试运行的Java+JNI应用程序是针对32位Linux编译的 在这种情况下,有两种解决方案:
- 如果您有应用程序的源代码,请将其移植到Linux 64位
- 如果没有,请下载该应用程序的Linux 64位版本
gcc
或g++
或任何东西。作为构建的一部分,您也可以尝试建议的命令。文章的要点是,如果这是关于您通过JNI访问的第三方库的警告,并且您相信它会顺利工作,那么可以忽略该警告。如果您能够更改库的编译,那么您可以研究如何为库启用堆栈保护。