0

(开发环境:CentOS 4.7、KDevelop 3.1.1、gcc 3.4.6)

我创建了一个 c++ 共享库和一个使用该共享库的测试可执行文件。一切正常。

但是,当我通过 Java 加载这个库时,即 Java 调用 JNI 进而加载这个共享库时,会出现一个错误,指出“ * glibc detected * free(): invalid next size”。应用程序在此之后退出。此错误发生在共享库的加载阶段。

谁能建议这可能是什么原因?

我正在使用 Java 版本 1.6.0_17(内部版本 1.6.0_17-b04)。此版本与 C/C++ 运行时库之间是否存在兼容性问题?

[执行 rpm -q 显示我机器上的 glibc 版本为 glibc-2.3.4-2.41 和 libstdc++ 版本为 libstdc++-3.4.6-10

ldd of shared library shows the following,
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00173000)
libssl.so.4 => /lib/libssl.so.4 (0x00286000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00185000)
libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00134000)
libc.so.6 => /lib/tls/libc.so.6 (0x002ba000)
/lib/ld-linux.so.2 (0x008a4000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00785000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x003e9000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x0013e000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x006ae000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00672000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x0044e000)
libdl.so.2 => /lib/libdl.so.2 (0x00540000)
libz.so.1 => /usr/lib/libz.so.1 (0x00141000)

]

4

2 回答 2

1

您确定发生错误时您的代码都没有运行吗?你有 JNI OnLoad 函数吗?一些静态构造函数?

通常,您描述的整体结构“正常工作”,所以我会查看您的代码。

如果您在调试器中运行 Java,并在 System.loadLibrary 之前放置一个断点(在 Java 中),那么您可以使用 gdb 附加到该进程并在 free 上设置一个断点。然后继续 java 调试器,看看你在 gdb 中看到了什么。

于 2010-02-27T21:51:08.980 回答
0

请参阅http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html一章和gcc 文档中的一章,了解 gcc 对 ABI 的作用。

于 2010-02-26T15:26:23.367 回答