http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590

--- Comment #3 from Jason Toffaletti <jason at cornsyrup dot org> 2012-03-15 
04:14:40 UTC ---
$ g++-4.7 -Wl,-M -v -static -pthread -std=c++0x -o thread thread.cc shows all
of libpthread being linked.

With a bit more digging I traced the problem to
/usr/include/c++/4.7.0/x86_64-linux-gnu/bits/gthr-posix.h declaring all of its
symbols with __attribute__((weakref)) even when linking statically. Which
caused the __gthread_* symbols to resolve to zero. I found this for some
background info http://gcc.gnu.org/ml/gcc/2005-10/msg00235.html

This change made my example work:

$ g++ -D_GLIBCXX_GTHREAD_USE_WEAK=0 -static -pthread -std=c++0x -o thread
thread.cc 
$ ./thread 
pthread_create works
std::thread works

However, if I change the code to call std::thread::detach instead of join, then
it crashes again with std::thread::detach being resolved to zero.

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x0000000000439785 in std::thread::detach() ()
#2  0x0000000000401f52 in main ()

Reply via email to