From ca18c37ee81500c922f7d3d6375d7ea7bab550b2 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 25 Mar 2020 17:10:16 -0400 Subject: [PATCH] [dev.link] cmd/link: define _etext, etc. in the linker on Solaris On Solaris, in the runtime it defines the external name of runtime.etext as _etext (runtime/os3_solaris.go:13). In CL 224939 we changed to put external names in the ELF symbol table more consistently. In this case it will contain _etext but not runtime.etext. To be conservative, this CL defines both runtime.etext and _text in the linker. Change-Id: I79f196e87b655042be97b0fbbab02d0ebc8db2fa Reviewed-on: https://go-review.googlesource.com/c/go/+/225537 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index cb0c9d8d25..8c240f4d90 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2419,6 +2419,24 @@ func (ctxt *Link) address() []*sym.Segment { ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length)) ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length)) + if ctxt.IsSolaris() { + // On Solaris, in the runtime it sets the external names of the + // end symbols. Unset them and define separate symbols, so we + // keep both. + etext := ctxt.Syms.ROLookup("runtime.etext", 0) + edata := ctxt.Syms.ROLookup("runtime.edata", 0) + end := ctxt.Syms.ROLookup("runtime.end", 0) + etext.SetExtname("runtime.etext") + edata.SetExtname("runtime.edata") + end.SetExtname("runtime.end") + ctxt.xdefine("_etext", etext.Type, etext.Value) + ctxt.xdefine("_edata", edata.Type, edata.Value) + ctxt.xdefine("_end", end.Type, end.Value) + ctxt.Syms.ROLookup("_etext", 0).Sect = etext.Sect + ctxt.Syms.ROLookup("_edata", 0).Sect = edata.Sect + ctxt.Syms.ROLookup("_end", 0).Sect = end.Sect + } + return order } -- 2.50.0