This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [v3] Link libstdc++.so with -pthread on Tru64 UNIX (PR target/45693)
- From: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- To: gcc-patches at gcc dot gnu dot org
- Cc: libstdc++ at gcc dot gnu dot org
- Date: Tue, 02 Nov 2010 17:20:17 +0100
- Subject: Re: [v3] Link libstdc++.so with -pthread on Tru64 UNIX (PR target/45693)
- References: <ydd39rq1irs.fsf@manam.CeBiTec.Uni-Bielefeld.DE>
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:
> As indicated in the PR, all C++ EH tests on Tru64 UNIX were failing
> since TLS (emutls in this case) was enabled by an unrelated patch. The
> problem is the same as in PR PR target/46131: emutls relies on a couple
> of libpthread functions. While there are dummy implementations in
> libgcc, of course we need the real thing here. The proper solution is
> to link libstdc++.so with -pthread here (instead of, e.g., linking with
> -lpthread in g++), so EH doesn't always work, even if linked with
> another driver or in a mixed-language problem. Manual testing indicated
> that this fixes the problem as expected. alpha-dec-osf5.1b testing in
> progress, will commit once completed successfully.
While the idea was sound, actual testing revealed two problems:
* The osf* case also needs to set os_include_dir.
* Cannot use -pthread in OPT_LDFLAGS: libtool swallows that,
-Wl,-pthread doesn't work (it's not a linker option), and -Wc,-pthread
doesn't work either (seems to be ignored with -shared), so I had to
fall back to using -lpthread instead.
This fixed all the EH related C++ failures.
Installed.
Rainer
2010-10-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR target/45693
* configure.host (osf*): Set os_include_dir to os/generic.
Add -lpthread to OPT_LDFLAGS.
diff -r 3048db040dd6 libstdc++-v3/configure.host
--- a/libstdc++-v3/configure.host Fri Oct 29 17:12:46 2010 +0000
+++ b/libstdc++-v3/configure.host Sat Oct 30 11:43:36 2010 +0200
@@ -261,6 +261,13 @@
netbsd*)
os_include_dir="os/bsd/netbsd"
;;
+ osf*)
+ os_include_dir="os/generic"
+ # libstdc++.so relies on emutls on Tru64 UNIX, which only works with the
+ # real functions implemented in libpthread.so, not with the dummies in
+ # libgcc, so always pass -lpthread.
+ OPT_LDFLAGS="${OPT_LDFLAGS} -lpthread"
+ ;;
qnx6.[12]*)
os_include_dir="os/qnx/qnx6.1"
c_model=c
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University