views:

77

answers:

2

(Developer environment: CentOS 4.7, KDevelop 3.1.1, gcc 3.4.6)

I created a c++ shared library and a test executable that uses this shared library. Things work fine.

But when I load this library through Java ie Java calls JNI which in turn loads this shared library, there is an error which states "* glibc detected * free(): invalid next size". The application exits after this. This error comes during loading phase of shared library.

Can anyone suggest what might be the possible reason for this?

I am using Java version 1.6.0_17 (build 1.6.0_17-b04). Could there a compatibility issue between this version and the C/C++ runtime libraries?

[Doing rpm -q shows glibc version on my machine as glibc-2.3.4-2.41 and libstdc++ version as 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)

]

A: 

See the chapter http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html and following one in gcc documentation for what gcc does about ABI.

AProgrammer
A: 

Are you sure that none of your code is running when the error happens? Do you have a JNI OnLoad function? Some static constructors?

Generally, the overall structure you describe 'just works', so I'd look to your code.

If you run the Java in a debugger, and put a breakpoint (in Java) just before System.loadLibrary, you can then use gdb to attach to the process and set a breakpoint on free. Then continue the java debugger and see what you see in gdb.

bmargulies