On Tue, Sep 24, 2013 at 01:13:53PM +0100, Jonathan Wakely wrote:
> On 24 September 2013 02:22, Alan Modra wrote:
> >
> > Try compiling that testcase with -static rather than -Wl,--as-needed.
> > You'll hit std::system_error just like you do here.  I believe that is
> > a libstdc++ bug, and can be solved by making libstdc++.a use strong
> > references to pthread symbols from std::thread::join() (and perhaps
> > other objects that provide c++ thread support, if there are such).
> 
> It's the std::thread constructor template that needs pthread_create.
> std::thread::join() needs pthread_join.

Ah, OK, I commented without looking at the source first, and it
shows.  :)

> > Otherwise we'd need to solve the transitive reference somehow.
> > ie. Teach the linker that a reference to std::thread::join() means
> > that pthread_create is required.  One obvious way to do that is have
> > the compiler reference pthread_create in objects that use
> > std::thread::join().
> 
> How would we have the compiler do that?

The std::thread constructor needs to emit a strong reference to
pthread_create in the user object file.  Probably the best way to do
that is as Jakub said, inline it and modify __gthread_create to only
use weak references to pthread symbols when compiling for a shared
library.  (When I wrote the above comment I was thing more along the
lines of a dummy reference via a pointer variable initialised to
pthread_create, but inlining the lot is simpler.)

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to