Before Solaris 11.5, struct dl_phdr_info lacked the dlpi_tls_modid member. While the support might be backported to Solaris 11.4, it certainly won't to previous Solaris releases. To work around this, I've used the following patch. Again, it's pretty straightforward.
Point of note: * On Solaris, FreeBSD and NetBSD, dl_phdr_info is always visible in <link.h>, while on Linux one needs to define _GNU_SOURCE. AC_USE_SYSTEM_EXTENSION takes care of this, but needs to be called early (i.e. not in DRUNTIME_OS_DLPI_TLS_MODID) to avoid an autoconf warning: configure.ac:129: warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS m4/druntime/os.m4:190: DRUNTIME_OS_DLPI_TLS_MODID is expanded from... configure.ac:129: the top level Tested on i386-pc-solaris2.11 (Solaris 11.4) and x86_64-pc-linux-gnu. Not unexpectedly, there are a couple of regressions compared to the Solaris 11.5/x86 results: +FAIL: gdc.test/runnable/testaa.d execution test +FAIL: gdc.test/runnable/testaa.d -fPIC execution test +FAIL: gdc.test/runnable/testaa.d -fPIC -shared-libphobos execution test +FAIL: gdc.test/runnable/testaa.d -shared-libphobos execution test 32 and 64-bit +FAIL: gdc.test/runnable/xtest55.d execution test +FAIL: gdc.test/runnable/xtest55.d -shared-libphobos execution test 64-bit only +FAIL: libphobos.shared/link_linkdep.d -I/vol/gcc/src/hg/trunk/local/libphobos/t estsuite/libphobos.shared liblinkdep.so lib.so -shared-libphobos execution test +FAIL: libphobos.shared/load_linkdep.d -shared-libphobos -ldl execution test +FAIL: libphobos.shared/load_loaddep.d -shared-libphobos -ldl execution test +FAIL: libphobos.shared/linkDR.c -shared-libphobos -ldl -pthread execution test +FAIL: libphobos.shared/host.c -ldl -pthread execution test +FAIL: libphobos.shared/loadDR.c -ldl -pthread -g execution test 32 and 64-bit +FAIL: libphobos.shared/link.d -I/vol/gcc/src/hg/trunk/local/libphobos/testsuite/libphobos.shared lib.so -shared-libphobos execution test 64-bit only I haven't looked much closer yet, just posting this to see if anything along those lines could be acceptable at all. Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University 2019-01-22 Rainer Orth <r...@cebitec.uni-bielefeld.de> * m4/druntime/os.m4 (DRUNTIME_OS_DLPI_TLS_MODID): New macro. * configure.ac: Use it. Call AC_USE_SYSTEM_EXTENSIONS. * configure: Regenerate. * Makefile.in, libdruntime/Makefile.in, src/Makefile.in, testsuite/Makefile.in: Regenerate. * libdruntime/gcc/config.d.in (OS_Have_Dlpi_Tls_Modid): Define. * libdruntime/rt/sections_elf_shared.d (scanSegments) <PT_TLS>: Only set pdso._tlsMod, pdso._tlsSize if OS_Have_Dlpi_Tls_Modid.
# HG changeset patch # Parent 517609f2fc6f40a6cbf15addd7f1006864256064 Work around lack of dlpi_tls_modid before Solaris 11.5 diff --git a/libphobos/configure.ac b/libphobos/configure.ac --- a/libphobos/configure.ac +++ b/libphobos/configure.ac @@ -32,6 +32,7 @@ AC_CONFIG_HEADERS(config.h) AM_ENABLE_MULTILIB(, ..) AC_CANONICAL_SYSTEM +AC_USE_SYSTEM_EXTENSIONS target_alias=${target_alias-$target} AC_SUBST(target_alias) @@ -126,6 +127,7 @@ DRUNTIME_OS_SOURCES DRUNTIME_OS_THREAD_MODEL DRUNTIME_OS_ARM_EABI_UNWINDER DRUNTIME_OS_MINFO_BRACKETING +DRUNTIME_OS_DLPI_TLS_MODID DRUNTIME_OS_LINK_SPEC WITH_LOCAL_DRUNTIME([ diff --git a/libphobos/libdruntime/gcc/config.d.in b/libphobos/libdruntime/gcc/config.d.in --- a/libphobos/libdruntime/gcc/config.d.in +++ b/libphobos/libdruntime/gcc/config.d.in @@ -38,6 +38,9 @@ enum ThreadModel GNU_Thread_Model = Thre // Whether the linker provides __start_minfo and __stop_minfo symbols enum Minfo_Bracketing = @DCFG_MINFO_BRACKETING@; +// Whether struct dl_phdr_info has dlpi_tls_modid member. +enum OS_Have_Dlpi_Tls_Modid = @DCFG_DLPI_TLS_MODID@; + // Whether target has support for builtin atomics. enum GNU_Have_Atomics = @DCFG_HAVE_ATOMIC_BUILTINS@; diff --git a/libphobos/libdruntime/rt/sections_elf_shared.d b/libphobos/libdruntime/rt/sections_elf_shared.d --- a/libphobos/libdruntime/rt/sections_elf_shared.d +++ b/libphobos/libdruntime/rt/sections_elf_shared.d @@ -751,8 +751,16 @@ void scanSegments(in ref dl_phdr_info in case PT_TLS: // TLS segment assert(!pdso._tlsSize); // is unique per DSO - pdso._tlsMod = info.dlpi_tls_modid; - pdso._tlsSize = phdr.p_memsz; + static if (OS_Have_Dlpi_Tls_Modid) + { + pdso._tlsMod = info.dlpi_tls_modid; + pdso._tlsSize = phdr.p_memsz; + } + else + { + pdso._tlsMod = 0; + pdso._tlsSize = 0; + } break; default: 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 @@ -183,6 +183,20 @@ AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING], AC_LANG_POP([C]) ]) +# DRUNTIME_OS_DLPI_TLS_MODID +# ---------------------------- +# Check if struct dl_phdr_info includes the dlpi_tls_modid member and +# substitute DCFG_DLPI_TLS_MODID. +AC_DEFUN([DRUNTIME_OS_DLPI_TLS_MODID], +[ + AC_LANG_PUSH([C]) + AC_CHECK_MEMBER([struct dl_phdr_info.dlpi_tls_modid], + [DCFG_DLPI_TLS_MODID=true], [DCFG_DLPI_TLS_MODID=false], + [[#include <link.h>]]) + AC_SUBST(DCFG_DLPI_TLS_MODID) + AC_LANG_POP([C]) +]) + # DRUNTIME_OS_LINK_SPEC # --------------------- # Add target-specific link options to link_spec.