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 ;;