Work around Solaris ld bug linking __tls_get_addr on 64-bit x86
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Sun, 14 Apr 2019 09:24:26 +0000 (09:24 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Sun, 14 Apr 2019 09:24:26 +0000 (09:24 +0000)
* m4/druntime/os.m4 (DRUNTIME_OS_LINK_SPEC): New macro.
* configure.ac: Call it.
* configure: Regenerate.
* Makefile.in, libdruntime/Makefile.in, src/Makefile.in,
testsuite/Makefile.in: Regenerate.
* src/libgphobos.spec.in (*link): Append OS_LINK_SPEC.

From-SVN: r270346

libphobos/ChangeLog
libphobos/Makefile.in
libphobos/configure
libphobos/configure.ac
libphobos/libdruntime/Makefile.in
libphobos/m4/druntime/os.m4
libphobos/src/Makefile.in
libphobos/src/libgphobos.spec.in
libphobos/testsuite/Makefile.in

index b70288b4064baaf4104f8fe8e41f6d642f316334..9c418dc8b7d38a63dcca97ef6c166b28c7e0decc 100644 (file)
@@ -1,5 +1,12 @@
 2019-04-14  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
+       * m4/druntime/os.m4 (DRUNTIME_OS_LINK_SPEC): New macro.
+       * configure.ac: Call it.
+       * configure: Regenerate.
+       * Makefile.in, libdruntime/Makefile.in, src/Makefile.in,
+       testsuite/Makefile.in: Regenerate.
+       * src/libgphobos.spec.in (*link): Append OS_LINK_SPEC.
+
        PR d/88150
        * libdruntime/gcc/sections/elf_shared.d [Solaris] (SharedELF): Set
        to true.
index 1cd4117f2ee0124d7e3f9baf8e69d5dc8d9473f1..127a62628cee5e8fdcb74adaf1391ea178b46a86 100644 (file)
@@ -252,6 +252,7 @@ NM = @NM@
 NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OS_LINK_SPEC = @OS_LINK_SPEC@
 OTOOL = @OTOOL@
 OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
index 48b78eb56dd21816cd554f8af175c052afe4ea3c..4ebad782abf02a621f482463f1b16ce0da087327 100755 (executable)
@@ -650,6 +650,7 @@ DCFG_HAVE_LIBATOMIC
 DCFG_HAVE_64BIT_ATOMICS
 DCFG_HAVE_ATOMIC_BUILTINS
 DCFG_HAVE_QSORT_R
+OS_LINK_SPEC
 DRUNTIME_OS_MINFO_BRACKETING_FALSE
 DRUNTIME_OS_MINFO_BRACKETING_TRUE
 DCFG_MINFO_BRACKETING
@@ -11495,7 +11496,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11498 "configure"
+#line 11499 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11601,7 +11602,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11604 "configure"
+#line 11605 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -14118,6 +14119,23 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+  case $target in
+    i?86-*-solaris2.* | x86_64-*-solaris2.*)
+      # 64-bit Solaris/x86 ld breaks calls to __tls_get_addr with non-TLS
+      # relocs.  Work around by disabling TLS transitions.  Not necessary
+      # on 32-bit x86, but cannot be distinguished reliably in specs.
+      druntime_ld_prog=`$CC -print-prog-name=ld`
+      if test -n "$druntime_ld_prog" \
+         && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then
+        :
+      else
+        OS_LINK_SPEC='-z relax=transtls'
+      fi
+      ;;
+  esac
+
+
+
   ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
index f1ab556bec0f562c542eb478aa1c5514419c99c4..8905252b021039be486e91110e6cb2f84b972e47 100644 (file)
@@ -125,6 +125,7 @@ DRUNTIME_OS_SOURCES
 DRUNTIME_OS_THREAD_MODEL
 DRUNTIME_OS_ARM_EABI_UNWINDER
 DRUNTIME_OS_MINFO_BRACKETING
+DRUNTIME_OS_LINK_SPEC
 DRUNTIME_LIBRARIES_CLIB
 
 WITH_LOCAL_DRUNTIME([
index efb1b952cf8e3a1d363b3235470e78579c634e0c..0994fcd813299ce0aa18ccf51e51b1dc0a9f2750 100644 (file)
@@ -566,6 +566,7 @@ NM = @NM@
 NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OS_LINK_SPEC = @OS_LINK_SPEC@
 OTOOL = @OTOOL@
 OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
index 92a2ba5cdf82d65d62199a2f6bae96e8049889e7..295926c43d308e45979dfe85b61ecc4800d8b4c8 100644 (file)
@@ -183,3 +183,25 @@ AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING],
   AM_CONDITIONAL([DRUNTIME_OS_MINFO_BRACKETING], [test "$DCFG_MINFO_BRACKETING" = "true"])
   AC_LANG_POP([C])
 ])
+
+# DRUNTIME_OS_LINK_SPEC
+# ---------------------
+# Add target-specific link options to link_spec.
+AC_DEFUN([DRUNTIME_OS_LINK_SPEC],
+[
+  case $target in
+    i?86-*-solaris2.* | x86_64-*-solaris2.*)
+      # 64-bit Solaris/x86 ld breaks calls to __tls_get_addr with non-TLS
+      # relocs.  Work around by disabling TLS transitions.  Not necessary
+      # on 32-bit x86, but cannot be distinguished reliably in specs.
+      druntime_ld_prog=`$CC -print-prog-name=ld`
+      if test -n "$druntime_ld_prog" \
+         && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then
+        :
+      else
+        OS_LINK_SPEC='-z relax=transtls'
+      fi
+      ;;
+  esac
+  AC_SUBST(OS_LINK_SPEC)
+])
index 0cc16ce1cf09e2fb82dc6f12d8bf0034618de04b..8fd6e5d384498c3b4a33d7e2df09a641483e8edf 100644 (file)
@@ -323,6 +323,7 @@ NM = @NM@
 NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OS_LINK_SPEC = @OS_LINK_SPEC@
 OTOOL = @OTOOL@
 OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
index ff9389696f36b05a9ac6ce327725dd8322377c5a..97a9ceaf48c854a9053d90b8070244e2c9beb556 100644 (file)
@@ -6,5 +6,8 @@
 
 @DRTSTUFF_SPEC@
 
+%rename link linkorig_gdc_renamed
+*link: %(linkorig_gdc_renamed) @OS_LINK_SPEC@
+
 %rename lib liborig_gdc_renamed
 *lib: %{debuglib|defaultlib|nophoboslib: ; :@SPEC_PHOBOS_DEPS@} %(liborig_gdc_renamed)
index 9c509f3772953d92ca6945f88b61f9fbdc766e4d..cacc03138f3a31b6fd87f0e62dd7e4ae8cd2dbf2 100644 (file)
@@ -196,6 +196,7 @@ NM = @NM@
 NMEDIT = @NMEDIT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OS_LINK_SPEC = @OS_LINK_SPEC@
 OTOOL = @OTOOL@
 OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@