Hi Iain,
> On Tue, 19 Feb 2019 at 13:58, Rainer Orth <[email protected]>
> 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 <[email protected]>
* 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
;;