From 4d51312053fc8d12ddcdad6c2cf07d9437ac5e60 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Sun, 14 Apr 2019 09:18:42 +0000 Subject: [PATCH] Use gcc/sections/elf_shared.d on Solaris 11.5 (PR d/88150) PR d/88150 * libdruntime/gcc/sections/elf_shared.d [Solaris] (SharedELF): Set to true. Import core.sys.solaris.dlfcn, core.sys.solaris.link, core.sys.solaris.sys.elf, core.sys.solaris.sys.link. (dummy_ref): Declare. (initSections): Initialize dummy_ref. (getDependencies): Set strtab. (handleForName): Don't dlclose handle. (findDSOInfoForAddr): Set IterateManually. (getprogname): Declare. (progname): Use it. * libdruntime/gcc/sections/package.d [Solaris]: Import gcc.sections.elf_shared instead of gcc.sections.solaris. * libdruntime/gcc/sections/solaris.d: Remove. * libdruntime/Makefile.am (DRUNTIME_DSOURCES): Remove gcc/sections/solaris.d. From-SVN: r270345 --- libphobos/ChangeLog | 21 +++ libphobos/libdruntime/Makefile.am | 2 +- libphobos/libdruntime/Makefile.in | 7 +- .../libdruntime/gcc/sections/elf_shared.d | 24 +++- libphobos/libdruntime/gcc/sections/package.d | 2 +- libphobos/libdruntime/gcc/sections/solaris.d | 126 ------------------ 6 files changed, 46 insertions(+), 136 deletions(-) delete mode 100644 libphobos/libdruntime/gcc/sections/solaris.d diff --git a/libphobos/ChangeLog b/libphobos/ChangeLog index 3dd4bbd68fa..b70288b4064 100644 --- a/libphobos/ChangeLog +++ b/libphobos/ChangeLog @@ -1,3 +1,24 @@ +2019-04-14 Rainer Orth + + PR d/88150 + * libdruntime/gcc/sections/elf_shared.d [Solaris] (SharedELF): Set + to true. + Import core.sys.solaris.dlfcn, core.sys.solaris.link, + core.sys.solaris.sys.elf, core.sys.solaris.sys.link. + (dummy_ref): Declare. + (initSections): Initialize dummy_ref. + (getDependencies): Set strtab. + (handleForName): Don't dlclose handle. + (findDSOInfoForAddr): Set IterateManually. + (getprogname): Declare. + (progname): Use it. + * libdruntime/gcc/sections/package.d [Solaris]: Import + gcc.sections.elf_shared instead of gcc.sections.solaris. + * libdruntime/gcc/sections/solaris.d: Remove. + * libdruntime/Makefile.am (DRUNTIME_DSOURCES): Remove + gcc/sections/solaris.d. + * libdruntime/Makefile.in: Regenerate. + 2019-04-13 Iain Buclaw * libdruntime/Makefile.am (DRUNTIME_CSOURCES): Remove bss_sections.c. diff --git a/libphobos/libdruntime/Makefile.am b/libphobos/libdruntime/Makefile.am index 8e36ce21449..8cdea52eb5c 100644 --- a/libphobos/libdruntime/Makefile.am +++ b/libphobos/libdruntime/Makefile.am @@ -141,7 +141,7 @@ DRUNTIME_DSOURCES = core/atomic.d core/attribute.d core/bitop.d \ core/sync/rwmutex.d core/sync/semaphore.d core/thread.d core/time.d \ core/vararg.d gcc/attribute.d gcc/backtrace.d gcc/builtins.d gcc/deh.d \ gcc/sections/android.d gcc/sections/elf_shared.d gcc/sections/osx.d \ - gcc/sections/package.d gcc/sections/solaris.d gcc/sections/win32.d \ + gcc/sections/package.d gcc/sections/win32.d \ gcc/sections/win64.d gcc/unwind/arm.d gcc/unwind/arm_common.d \ gcc/unwind/c6x.d gcc/unwind/generic.d gcc/unwind/package.d \ gcc/unwind/pe.d object.d rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d \ diff --git a/libphobos/libdruntime/Makefile.in b/libphobos/libdruntime/Makefile.in index 0a27afac545..efb1b952cf8 100644 --- a/libphobos/libdruntime/Makefile.in +++ b/libphobos/libdruntime/Makefile.in @@ -196,8 +196,8 @@ am__objects_1 = core/atomic.lo core/attribute.lo core/bitop.lo \ core/vararg.lo gcc/attribute.lo gcc/backtrace.lo \ gcc/builtins.lo gcc/deh.lo gcc/sections/android.lo \ gcc/sections/elf_shared.lo gcc/sections/osx.lo \ - gcc/sections/package.lo gcc/sections/solaris.lo \ - gcc/sections/win32.lo gcc/sections/win64.lo gcc/unwind/arm.lo \ + gcc/sections/package.lo gcc/sections/win32.lo \ + gcc/sections/win64.lo gcc/unwind/arm.lo \ gcc/unwind/arm_common.lo gcc/unwind/c6x.lo \ gcc/unwind/generic.lo gcc/unwind/package.lo gcc/unwind/pe.lo \ object.lo rt/aApply.lo rt/aApplyR.lo rt/aaA.lo rt/adi.lo \ @@ -737,7 +737,7 @@ DRUNTIME_DSOURCES = core/atomic.d core/attribute.d core/bitop.d \ core/sync/rwmutex.d core/sync/semaphore.d core/thread.d core/time.d \ core/vararg.d gcc/attribute.d gcc/backtrace.d gcc/builtins.d gcc/deh.d \ gcc/sections/android.d gcc/sections/elf_shared.d gcc/sections/osx.d \ - gcc/sections/package.d gcc/sections/solaris.d gcc/sections/win32.d \ + gcc/sections/package.d gcc/sections/win32.d \ gcc/sections/win64.d gcc/unwind/arm.d gcc/unwind/arm_common.d \ gcc/unwind/c6x.d gcc/unwind/generic.d gcc/unwind/package.d \ gcc/unwind/pe.d object.d rt/aApply.d rt/aApplyR.d rt/aaA.d rt/adi.d \ @@ -1090,7 +1090,6 @@ gcc/sections/android.lo: gcc/sections/$(am__dirstamp) gcc/sections/elf_shared.lo: gcc/sections/$(am__dirstamp) gcc/sections/osx.lo: gcc/sections/$(am__dirstamp) gcc/sections/package.lo: gcc/sections/$(am__dirstamp) -gcc/sections/solaris.lo: gcc/sections/$(am__dirstamp) gcc/sections/win32.lo: gcc/sections/$(am__dirstamp) gcc/sections/win64.lo: gcc/sections/$(am__dirstamp) gcc/unwind/$(am__dirstamp): diff --git a/libphobos/libdruntime/gcc/sections/elf_shared.d b/libphobos/libdruntime/gcc/sections/elf_shared.d index f70c2329ade..40857ce28ed 100644 --- a/libphobos/libdruntime/gcc/sections/elf_shared.d +++ b/libphobos/libdruntime/gcc/sections/elf_shared.d @@ -28,6 +28,7 @@ else version (FreeBSD) enum SharedELF = true; else version (NetBSD) enum SharedELF = true; else version (DragonFlyBSD) enum SharedELF = true; else version (CRuntime_UClibc) enum SharedELF = true; +else version (Solaris) enum SharedELF = true; else enum SharedELF = false; static if (SharedELF): @@ -61,6 +62,13 @@ else version (DragonFlyBSD) import core.sys.dragonflybsd.sys.elf; import core.sys.dragonflybsd.sys.link_elf; } +else version (Solaris) +{ + import core.sys.solaris.dlfcn; + import core.sys.solaris.link; + import core.sys.solaris.sys.elf; + import core.sys.solaris.sys.link; +} else { static assert(0, "unimplemented"); @@ -163,6 +171,7 @@ __gshared bool _isRuntimeInitialized; version (FreeBSD) private __gshared void* dummy_ref; version (DragonFlyBSD) private __gshared void* dummy_ref; version (NetBSD) private __gshared void* dummy_ref; +version (Solaris) private __gshared void* dummy_ref; /**** * Gets called on program startup just before GC is initialized. @@ -174,6 +183,7 @@ void initSections() nothrow @nogc version (FreeBSD) dummy_ref = &_d_dso_registry; version (DragonFlyBSD) dummy_ref = &_d_dso_registry; version (NetBSD) dummy_ref = &_d_dso_registry; + version (Solaris) dummy_ref = &_d_dso_registry; } @@ -719,6 +729,8 @@ version (Shared) strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate else version (DragonFlyBSD) strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate + else version (Solaris) + strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate else static assert(0, "unimplemented"); break; @@ -745,7 +757,8 @@ version (Shared) void* handleForName(const char* name) { auto handle = .dlopen(name, RTLD_NOLOAD | RTLD_LAZY); - if (handle !is null) .dlclose(handle); // drop reference count + version (Solaris) { } + else if (handle !is null) .dlclose(handle); // drop reference count return handle; } } @@ -799,9 +812,10 @@ void scanSegments(in ref dl_phdr_info info, DSO* pdso) nothrow @nogc */ bool findDSOInfoForAddr(in void* addr, dl_phdr_info* result=null) nothrow @nogc { - version (linux) enum IterateManually = true; - else version (NetBSD) enum IterateManually = true; - else enum IterateManually = false; + version (linux) enum IterateManually = true; + else version (NetBSD) enum IterateManually = true; + else version (Solaris) enum IterateManually = true; + else enum IterateManually = false; static if (IterateManually) { @@ -864,6 +878,7 @@ version (linux) import core.sys.linux.errno : program_invocation_name; version (FreeBSD) extern(C) const(char)* getprogname() nothrow @nogc; version (DragonFlyBSD) extern(C) const(char)* getprogname() nothrow @nogc; version (NetBSD) extern(C) const(char)* getprogname() nothrow @nogc; +version (Solaris) extern(C) const(char)* getprogname() nothrow @nogc; @property const(char)* progname() nothrow @nogc { @@ -871,6 +886,7 @@ version (NetBSD) extern(C) const(char)* getprogname() nothrow @nogc; version (FreeBSD) return getprogname(); version (DragonFlyBSD) return getprogname(); version (NetBSD) return getprogname(); + version (Solaris) return getprogname(); } const(char)[] dsoName(const char* dlpi_name) nothrow @nogc diff --git a/libphobos/libdruntime/gcc/sections/package.d b/libphobos/libdruntime/gcc/sections/package.d index 07617ea977f..02c9752ef52 100644 --- a/libphobos/libdruntime/gcc/sections/package.d +++ b/libphobos/libdruntime/gcc/sections/package.d @@ -35,7 +35,7 @@ else version (NetBSD) else version (DragonFlyBSD) public import gcc.sections.elf_shared; else version (Solaris) - public import gcc.sections.solaris; + public import gcc.sections.elf_shared; else version (OSX) public import gcc.sections.osx; else version (CRuntime_DigitalMars) diff --git a/libphobos/libdruntime/gcc/sections/solaris.d b/libphobos/libdruntime/gcc/sections/solaris.d deleted file mode 100644 index e66325b7a2c..00000000000 --- a/libphobos/libdruntime/gcc/sections/solaris.d +++ /dev/null @@ -1,126 +0,0 @@ -// Solaris-specific support for sections. -// Copyright (C) 2019 Free Software Foundation, Inc. - -// GCC is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 3, or (at your option) any later -// version. - -// GCC is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -module gcc.sections.solaris; - -version (Solaris): - -// debug = PRINTF; -debug(PRINTF) import core.stdc.stdio; -import core.stdc.stdlib : malloc, free; -import rt.deh, rt.minfo; - -struct SectionGroup -{ - static int opApply(scope int delegate(ref SectionGroup) dg) - { - return dg(_sections); - } - - static int opApplyReverse(scope int delegate(ref SectionGroup) dg) - { - return dg(_sections); - } - - @property immutable(ModuleInfo*)[] modules() const nothrow @nogc - { - return _moduleGroup.modules; - } - - @property ref inout(ModuleGroup) moduleGroup() inout nothrow @nogc - { - return _moduleGroup; - } - - @property immutable(FuncTable)[] ehTables() const nothrow @nogc - { - auto pbeg = cast(immutable(FuncTable)*)&__start_deh; - auto pend = cast(immutable(FuncTable)*)&__stop_deh; - return pbeg[0 .. pend - pbeg]; - } - - @property inout(void[])[] gcRanges() inout nothrow @nogc - { - return _gcRanges[]; - } - -private: - ModuleGroup _moduleGroup; - void[][1] _gcRanges; -} - -void initSections() nothrow @nogc -{ - auto mbeg = cast(immutable ModuleInfo**)&__start_minfo; - auto mend = cast(immutable ModuleInfo**)&__stop_minfo; - _sections.moduleGroup = ModuleGroup(mbeg[0 .. mend - mbeg]); - - auto pbeg = cast(void*)&__dso_handle; - auto pend = cast(void*)&_end; - _sections._gcRanges[0] = pbeg[0 .. pend - pbeg]; -} - -void finiSections() nothrow @nogc -{ -} - -void[] initTLSRanges() nothrow @nogc -{ - auto pbeg = cast(void*)&_tlsstart; - auto pend = cast(void*)&_tlsend; - return pbeg[0 .. pend - pbeg]; -} - -void finiTLSRanges(void[] rng) nothrow @nogc -{ -} - -void scanTLSRanges(void[] rng, scope void delegate(void* pbeg, void* pend) nothrow dg) nothrow -{ - dg(rng.ptr, rng.ptr + rng.length); -} - -private: - -__gshared SectionGroup _sections; - -extern(C) -{ - /* Symbols created by the compiler/linker and inserted into the - * object file that 'bracket' sections. - */ - extern __gshared - { - void* __start_deh; - void* __stop_deh; - void* __start_minfo; - void* __stop_minfo; - int __dso_handle; - int _end; - } - - extern - { - void* _tlsstart; - void* _tlsend; - } -}