Hi Iain,

> On Tue, 19 Feb 2019 at 13:58, Rainer Orth <r...@cebitec.uni-bielefeld.de> 
> wrote:
>>
>> Hi Iain,
>>
>> >> Thanks.  This will have to wait for
>> >>
>> >>         [libphobos] Use sections_elf_shared.d on Solaris 11.5 (PR d/88150)
>> >>         https://gcc.gnu.org/ml/gcc-patches/2019-01/msg01661.html
>> >
>> > I'll make a fork of sections support tonight, as that seems to be the
>> > right way forwards.
>> >
>> > Other parts will need upstreaming, I can do that as well.
>>
>> that would be great, thanks.
>>
>> >> and
>> >>         [libphobos] Work around lack of dlpi_tls_modid before Solaris 11.5
>> >>         https://gcc.gnu.org/ml/gcc-patches/2019-01/msg01664.html
>> >>
>> >
>> > Johannes has already commented there, and he is right about needing a
>> > way to get tls data from DSOs.
>>
>> Understood.  Maybe I can find a way to generalize the hack derived from
>> sections_ldc.d to TLS segments outside the executable.
>>
>> >> of course.  Maybe even
>> >>
>> >>         [libphobos] Work around Solaris ld bug linking __tls_get_addr on
>> >> 64-bit x86
>> >>         https://gcc.gnu.org/ml/gcc-patches/2019-01/msg01663.html
>> >>
>> >> will be needed depending on whether a proper ld fix makes it into
>> >> Solaris 11.5 or not.
>> >
>> > I'm not sure about this, but haven't looked at it properly just yet.
>>
>> I don't think you need concern yourself with this very much: it's just a
>> hack around a Solaris ld bug, suggested by the Solaris linker engineers
>> for the moment.  Once the dlpi_tls_modid patch lands in Solaris 11.5
>> (this week or next), I'll ask if they see a chance to have that bug
>> fixed in time for the Solaris 11.5 release.  If so, nobody besides
>> myself will ever be exposed to this issue.
>>
>
> I've just given building gcc a try in an OpenIndiana VM, and get the 
> following:
>
> ld: fatal: option -z has illegal argument 'relax=transtls'
> ld: fatal: flags processing errors
> collect2: error: ld returned 1 exit status
>
> $ ld --version
> ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1756 
> (illumos)
>
> My fatal mistake of course was not configuring with
> --with-ld=/usr/gnu/bin/ld, however it is notable that not all Solaris
> linkers support this relax=transtls option.

I finally got back to this and did some experiments of my own: even the
latest Illumos ld doesn't implement -z relax=transtls, neither has it
fixed the underlying bug, so it's useless for 64-bit Illumos/x86.

The following patch checks for those conditions (ld support for -z
relax=transtls or gld in use) and only enables libphobos if they are
met.

I had to move the whole enable_libphobos/LIBPHOBOS_SUPPORTED block down
in configure.ac so it's able to use the results of the augmented
DRUNTIME_OS_LINK_SPEC.

While I didn't test the patch on Illumos (gcc builds inside a VM are
slow), I tried it on Solaris 10/x86 with gas/ld and gas/gld (and an
improved version of the patch for PR d/88238) where it behaved as
expected.  I've also included a previous version in a Solaris 11/x86
bootstrap.

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


2019-04-25  Rainer Orth  <r...@cebitec.uni-bielefeld.de>

        * m4/druntime/os.m4 (DRUNTIME_OS_LINK_SPEC): Only use -z
        relax=transtls if linker supports it.
        * configure.ac (enable_libphobos, LIBPHOBOS_SUPPORTED): Move down.
        (x86_64-*-solaris2.* | i?86-*-solaris2.*): Only
        mark supported with either gld or ld -z relax=transtls.
        * configure: Regenerate.

# HG changeset patch
# Parent  c76abee7081bb8c24b2ca6f55749d092ae8cf3ea
Check if Solaris ld supports -z relax=transtls

diff --git a/libphobos/configure.ac b/libphobos/configure.ac
--- a/libphobos/configure.ac
+++ b/libphobos/configure.ac
@@ -113,42 +113,6 @@ AC_SUBST(phobos_compiler_shared_flag)
 lt_prog_compiler_pic_D="$phobos_compiler_shared_flag"
 pic_mode='default'
 
-AC_MSG_CHECKING([for --enable-libphobos])
-AC_ARG_ENABLE(libphobos,
-  [AS_HELP_STRING([--enable-libphobos], [Enable libphobos])])
-AC_MSG_RESULT($enable_libphobos)
-
-# See if supported.
-unset LIBPHOBOS_SUPPORTED
-AC_MSG_CHECKING([for host support for libphobos])
-. ${srcdir}/configure.tgt
-case ${host} in
-  x86_64-*-solaris2.* | i?86-*-solaris2.*)
-    # libphobos doesn't compile with the Solaris/x86 assembler due to a
-    # relatively low linelength limit.
-    as_prog=`$CC -print-prog-name=as`
-    if test -n "$as_prog" && $as_prog -v /dev/null 2>&1 | grep GNU > /dev/null 2>&1; then
-      druntime_cv_use_gas=yes;
-    else
-      druntime_cv_use_gas=no;
-    fi
-    rm -f a.out
-    if test x$druntime_cv_use_gas = xno; then
-      LIBPHOBOS_SUPPORTED=no
-    fi
-    ;;
-esac
-AC_MSG_RESULT($LIBPHOBOS_SUPPORTED)
-
-# Decide if it's usable.
-case $LIBPHOBOS_SUPPORTED:$enable_libphobos in
-*:no)  use_libphobos=no  ;;
-*:yes) use_libphobos=yes ;;
-yes:*) use_libphobos=yes ;;
-*:*)   use_libphobos=no  ;;
-esac
-AM_CONDITIONAL(ENABLE_LIBPHOBOS, test x$use_libphobos = xyes)
-
 # Determine what GCC version number to use in filesystem paths.
 GCC_BASE_VER
 
@@ -184,6 +148,46 @@ DRUNTIME_LIBRARIES_NET
 DRUNTIME_LIBRARIES_ZLIB
 DRUNTIME_INSTALL_DIRECTORIES
 
+AC_MSG_CHECKING([for --enable-libphobos])
+AC_ARG_ENABLE(libphobos,
+  [AS_HELP_STRING([--enable-libphobos], [Enable libphobos])])
+AC_MSG_RESULT($enable_libphobos)
+
+# See if supported.
+unset LIBPHOBOS_SUPPORTED
+AC_MSG_CHECKING([for host support for libphobos])
+. ${srcdir}/configure.tgt
+case ${host} in
+  x86_64-*-solaris2.* | i?86-*-solaris2.*)
+    # libphobos doesn't compile with the Solaris/x86 assembler due to a
+    # relatively low linelength limit.
+    as_prog=`$CC -print-prog-name=as`
+    if test -n "$as_prog" && $as_prog -v /dev/null 2>&1 | grep GNU > /dev/null 2>&1; then
+      druntime_cv_use_gas=yes;
+    else
+      druntime_cv_use_gas=no;
+    fi
+    rm -f a.out
+    if test x$druntime_cv_use_gas = xno; then
+      LIBPHOBOS_SUPPORTED=no
+    fi
+    # 64-bit D execution fails with Solaris ld without -z relax=transtls support.
+    if test "$druntime_ld_gld" = "no" && test "$druntime_ld_relax_transtls" = "no"; then
+      LIBPHOBOS_SUPPORTED=no
+    fi
+    ;;
+esac
+AC_MSG_RESULT($LIBPHOBOS_SUPPORTED)
+
+# Decide if it's usable.
+case $LIBPHOBOS_SUPPORTED:$enable_libphobos in
+*:no)  use_libphobos=no  ;;
+*:yes) use_libphobos=yes ;;
+yes:*) use_libphobos=yes ;;
+*:*)   use_libphobos=no  ;;
+esac
+AM_CONDITIONAL(ENABLE_LIBPHOBOS, test x$use_libphobos = xyes)
+
 # Add drtbegin.o/drtend.o to startfile/endfile specs in libgphobos.spec
 if test "$DCFG_MINFO_BRACKETING" = "false"; then
     DRTSTUFF_SPEC=$srcdir/src/drtstuff.spec
diff --git a/libphobos/m4/druntime/os.m4 b/libphobos/m4/druntime/os.m4
--- a/libphobos/m4/druntime/os.m4
+++ b/libphobos/m4/druntime/os.m4
@@ -209,10 +209,22 @@ AC_DEFUN([DRUNTIME_OS_LINK_SPEC],
       # 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`
+      druntime_ld_gld=no
+      druntime_ld_relax_transtls=no
       if test -n "$druntime_ld_prog" \
          && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then
-        :
+        druntime_ld_gld=yes
       else
+        echo 'int main (void) { return 0; }' > conftest.c
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -Wl,-z,relax=transtls"
+        if $CC $CFLAGS $LDFLAGS -o conftest conftest.c > /dev/null 2>&1; then
+          druntime_ld_relax_transtls=yes
+        fi
+        LDFLAGS="$save_LDFLAGS"
+        rm -f conftest.c conftest
+      fi
+      if test "$druntime_ld_relax_transtls" = "yes"; then
         OS_LINK_SPEC='-z relax=transtls'
       fi
       ;;

Reply via email to