1
0
mirror of https://github.com/golang/go synced 2024-11-24 04:40:24 -07:00

cmd/link: pass -Wl,-z,nodelete when creating an ELF shared library

Go shared libraries do not support dlclose, and there is no likelihood
that they will suppose dlclose in the future.  Set the DF_1_NODELETE
flag to tell the dynamic linker to not attempt to remove them from
memory.  This makes the shared library act as though every call to
dlopen passed the RTLD_NODELETE flag.

Fixes #12582.
Update #11100.
Update #12873.

Change-Id: Id4b6e90a1b54e2e6fc8355b5fb22c5978fc762b4
Reviewed-on: https://go-review.googlesource.com/15605
Reviewed-by: Michael Hudson-Doyle <michael.hudson@canonical.com>
This commit is contained in:
Ian Lance Taylor 2015-10-08 10:22:50 -07:00
parent 91059de095
commit bd7de94d7f

View File

@ -982,11 +982,14 @@ func hostlink() {
if HEADTYPE == obj.Hdarwin { if HEADTYPE == obj.Hdarwin {
argv = append(argv, "-dynamiclib") argv = append(argv, "-dynamiclib")
} else { } else {
// ELF.
argv = append(argv, "-Wl,-Bsymbolic") argv = append(argv, "-Wl,-Bsymbolic")
if UseRelro() { if UseRelro() {
argv = append(argv, "-Wl,-z,relro") argv = append(argv, "-Wl,-z,relro")
} }
argv = append(argv, "-shared") // Pass -z nodelete to mark the shared library as
// non-closeable: a dlclose will do nothing.
argv = append(argv, "-shared", "-Wl,-z,nodelete")
} }
case BuildmodeShared: case BuildmodeShared:
// TODO(mwhudson): unless you do this, dynamic relocations fill // TODO(mwhudson): unless you do this, dynamic relocations fill