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 <[email protected]>
* 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.