Bug#635894: libgomp1: Linking a JNI library with openmp makes std::cerr::operator<< crash
Package: libgomp1
Version: 4.6.1-4
Severity: important
When linking a C++ library which will be used with JNI with openmp, this
makes std::cerr::operator<< crashes when this library is used inside a
JVM.
A test case is provided in the .tar.gz available here:
http://public.geekou.info/jni-openmp.tar.gz .
It contains a library (libtestcerr.so) that implements a JNI interface,
the Java class that goes with that interface, a Makefile and a small
bash script to execute the test.
The default Makefile compiles the library with g++ and links it with
OpenMP :
$ make
javac TestCerr.java
g++ -shared -fPIC -fopenmp -lgomp TestCerr.cpp -o libtestcerr.so
When launching the Java class, whose main function simply calls a function
inside the library that calls std::cerr::<<, a segfault happens:
$ cat launch.sh
#!/bin/bash
LD_LIBRARY_PATH=. gdb --args java TestCerr
$ ./launch.sh
$ ./launch.sh
GNU gdb (GDB) 7.2-debian
[...]
Reading symbols from /usr/bin/java...(no debugging symbols found)...done.
(gdb) r
Starting program: /usr/bin/java TestCerr
[Thread debugging using libthread_db enabled]
process 5313 is executing new program: /usr/lib/jvm/java-6-openjdk/jre/bin/java
[Thread debugging using libthread_db enabled]
[New Thread 0x7ffff7fcd700 (LWP 5316)]
[New Thread 0x7ff7fe441700 (LWP 5317)]
[New Thread 0x7ff7fe340700 (LWP 5318)]
[New Thread 0x7ff7fe23f700 (LWP 5319)]
[New Thread 0x7ff7fe13e700 (LWP 5320)]
[New Thread 0x7ff7fe03d700 (LWP 5321)]
[New Thread 0x7ff7fdf3c700 (LWP 5322)]
[New Thread 0x7ff7fde3b700 (LWP 5323)]
[New Thread 0x7ff7fdd3a700 (LWP 5324)]
[New Thread 0x7ff7fdc39700 (LWP 5325)]
[New Thread 0x7ff7fdb38700 (LWP 5326)]
[New Thread 0x7ff7fda37700 (LWP 5327)]
[New Thread 0x7ff7fd936700 (LWP 5328)]
[New Thread 0x7ff7fd835700 (LWP 5329)]
[New Thread 0x7ff7fd734700 (LWP 5330)]
[New Thread 0x7ff7fd633700 (LWP 5331)]
[New Thread 0x7ff7fd532700 (LWP 5332)]
[New Thread 0x7ff7fd431700 (LWP 5333)]
[New Thread 0x7ff7fd330700 (LWP 5334)]
[New Thread 0x7ff7f7cfc700 (LWP 5335)]
[New Thread 0x7ff7f7bfb700 (LWP 5336)]
[New Thread 0x7ff7f7afa700 (LWP 5337)]
[New Thread 0x7ff7f780a700 (LWP 5338)]
[New Thread 0x7ff7f7709700 (LWP 5339)]
[New Thread 0x7ff7f7608700 (LWP 5340)]
[New Thread 0x7ff7f7507700 (LWP 5341)]
[New Thread 0x7ff7f7406700 (LWP 5342)]
hi to cout
hi to cerr
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7fcd700 (LWP 5316)]
0x00007ff7f6c9f189 in std::uncaught_exception() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(gdb) bt
#0 0x00007ff7f6c9f189 in std::uncaught_exception() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1 0x00007ff7f6c7ecc8 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2 0x00007ff7f6c7f05f in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ff7f70fa96a in Java_TestCerr_show_1cerr () from /home/aguinet/dev/jni/libtestcerr.so
#4 0x00007ffff222ec48 in ?? ()
#5 0x00007ffff7fcc790 in ?? ()
#6 0x00007ff8050cb1a8 in ?? ()
#7 0x00007ffff7fcc7e8 in ?? ()
#8 0x00007ff8050cb610 in ?? ()
#9 0x0000000000000000 in ?? ()
(gdb)
Please note that OpenJDK is used, but the same thing happens with Sun's JDK.
If the library is compiled without OpenMP support, everything runs fine :
(after changing the Makefile)
$ make
javac TestCerr.java
g++ -shared -fPIC TestCerr.cpp -o libtestcerr.so
$ ./launch.sh
$ ./launch.sh
GNU gdb (GDB) 7.2-debian
[...]
Reading symbols from /usr/bin/java...(no debugging symbols found)...done.
(gdb) r
Starting program: /usr/bin/java TestCerr
[Thread debugging using libthread_db enabled]
process 5467 is executing new program: /usr/lib/jvm/java-6-openjdk/jre/bin/java
[Thread debugging using libthread_db enabled]
[New Thread 0x7ffff7fcd700 (LWP 5470)]
[New Thread 0x7ff7fe441700 (LWP 5471)]
[New Thread 0x7ff7fe340700 (LWP 5472)]
[New Thread 0x7ff7fe23f700 (LWP 5473)]
[New Thread 0x7ff7fe13e700 (LWP 5474)]
[New Thread 0x7ff7fe03d700 (LWP 5475)]
[New Thread 0x7ff7fdf3c700 (LWP 5476)]
[New Thread 0x7ff7fde3b700 (LWP 5477)]
[New Thread 0x7ff7fdd3a700 (LWP 5478)]
[New Thread 0x7ff7fdc39700 (LWP 5479)]
[New Thread 0x7ff7fdb38700 (LWP 5480)]
[New Thread 0x7ff7fda37700 (LWP 5481)]
[New Thread 0x7ff7fd936700 (LWP 5482)]
[New Thread 0x7ff7fd835700 (LWP 5483)]
[New Thread 0x7ff7fd734700 (LWP 5484)]
[New Thread 0x7ff7fd633700 (LWP 5485)]
[New Thread 0x7ff7fd532700 (LWP 5486)]
[New Thread 0x7ff7fd431700 (LWP 5487)]
[New Thread 0x7ff7fd330700 (LWP 5488)]
[New Thread 0x7ff7f7cfc700 (LWP 5489)]
[New Thread 0x7ff7f7bfb700 (LWP 5490)]
[New Thread 0x7ff7f7afa700 (LWP 5491)]
[New Thread 0x7ff7f780a700 (LWP 5492)]
[New Thread 0x7ff7f7709700 (LWP 5493)]
[New Thread 0x7ff7f7608700 (LWP 5494)]
[New Thread 0x7ff7f7507700 (LWP 5495)]
[New Thread 0x7ff7f7406700 (LWP 5496)]
hi to cout
hi to cerr
hi
[Thread 0x7ff7f7406700 (LWP 5496) exited]
[Thread 0x7ff7f780a700 (LWP 5492) exited]
[Thread 0x7ff7f7507700 (LWP 5495) exited]
[Thread 0x7ff7f7608700 (LWP 5494) exited]
[Thread 0x7ff7f7709700 (LWP 5493) exited]
[Thread 0x7ff7f7afa700 (LWP 5491) exited]
[Thread 0x7ff7f7bfb700 (LWP 5490) exited]
[Thread 0x7ff7fd330700 (LWP 5488) exited]
[Thread 0x7ff7fd431700 (LWP 5487) exited]
[Thread 0x7ff7fd532700 (LWP 5486) exited]
[Thread 0x7ff7fd633700 (LWP 5485) exited]
[Thread 0x7ff7fd734700 (LWP 5484) exited]
[Thread 0x7ff7fd835700 (LWP 5483) exited]
[Thread 0x7ff7fd936700 (LWP 5482) exited]
[Thread 0x7ff7fda37700 (LWP 5481) exited]
[Thread 0x7ff7fdb38700 (LWP 5480) exited]
[Thread 0x7ff7fdc39700 (LWP 5479) exited]
[Thread 0x7ff7fdd3a700 (LWP 5478) exited]
[Thread 0x7ff7fde3b700 (LWP 5477) exited]
[Thread 0x7ff7fdf3c700 (LWP 5476) exited]
[Thread 0x7ff7fe03d700 (LWP 5475) exited]
[Thread 0x7ff7fe13e700 (LWP 5474) exited]
[Thread 0x7ff7fe23f700 (LWP 5473) exited]
[Thread 0x7ff7fe340700 (LWP 5472) exited]
[Thread 0x7ff7fe441700 (LWP 5471) exited]
[Thread 0x7ffff7fcd700 (LWP 5470) exited]
(gdb)
Also, if icc is used instead of gcc, no crashes happen (that's why I reported
this bug here and not to Sun/Oracle).
Moreover, I don't really know if this is a Debian specific bug or not, because
for now I only have access to Debian systems.
I also tried this on an up-to-date sid version of Debian, and the same thing happens.
I also tried to reproduce this bug outside of the Java/JNI environnement, but I
didn't manage to. That's why I also don't really know where the problem comes
from, or if there are issues on both sides !
-- System Information:
Debian Release: wheezy/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.39-2-amd64 (SMP w/24 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages libgomp1 depends on:
ii gcc-4.6-base 4.6.1-4 GCC, the GNU Compiler Collection (
ii libc6 2.13-10 Embedded GNU C Library: Shared lib
ii multiarch-support 2.13-10 Transitional package to ensure mul
libgomp1 recommends no packages.
libgomp1 suggests no packages.
-- no debconf information
Reply to: