aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hudson-Doyle <michael.hudson@canonical.com>2018-06-21 10:31:57 +1200
committerIan Lance Taylor <iant@golang.org>2018-06-23 00:16:14 +0000
commitd6a27e8edcd992b36446c5021a3c7560d983e9a6 (patch)
treec787843d754f7e143eb2470ff075b80a2e982399
parent899e0e35253e8463ca74d75638c07bd54dca251c (diff)
downloadgo-d6a27e8edcd992b36446c5021a3c7560d983e9a6.tar.xz
cmd/link: never coalesce type descriptors when dynamically linking Go
Add a test by making misc/cgo/testshared/src/trivial.go marginally less trivial. Fixes #25970. Change-Id: I8815d0c56b8850fcdbf9b45f8406f37bd21b6865 Reviewed-on: https://go-review.googlesource.com/120235 Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--misc/cgo/testshared/src/trivial/trivial.go5
-rw-r--r--src/cmd/link/internal/ld/symtab.go38
2 files changed, 25 insertions, 18 deletions
diff --git a/misc/cgo/testshared/src/trivial/trivial.go b/misc/cgo/testshared/src/trivial/trivial.go
index da29a2cadf..6ade47ce36 100644
--- a/misc/cgo/testshared/src/trivial/trivial.go
+++ b/misc/cgo/testshared/src/trivial/trivial.go
@@ -1,4 +1,9 @@
package main
func main() {
+ // This is enough to make sure that the executable references
+ // a type descriptor, which was the cause of
+ // https://golang.org/issue/25970.
+ c := make(chan int)
+ _ = c
}
diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go
index bb8c1992ba..88d476710b 100644
--- a/src/cmd/link/internal/ld/symtab.go
+++ b/src/cmd/link/internal/ld/symtab.go
@@ -368,28 +368,30 @@ func (ctxt *Link) symtab() {
// pseudo-symbols to mark locations of type, string, and go string data.
var symtype *sym.Symbol
var symtyperel *sym.Symbol
- if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) {
- s = ctxt.Syms.Lookup("type.*", 0)
+ if !ctxt.DynlinkingGo() {
+ if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) {
+ s = ctxt.Syms.Lookup("type.*", 0)
- s.Type = sym.STYPE
- s.Size = 0
- s.Attr |= sym.AttrReachable
- symtype = s
+ s.Type = sym.STYPE
+ s.Size = 0
+ s.Attr |= sym.AttrReachable
+ symtype = s
- s = ctxt.Syms.Lookup("typerel.*", 0)
+ s = ctxt.Syms.Lookup("typerel.*", 0)
- s.Type = sym.STYPERELRO
- s.Size = 0
- s.Attr |= sym.AttrReachable
- symtyperel = s
- } else if !ctxt.DynlinkingGo() {
- s = ctxt.Syms.Lookup("type.*", 0)
+ s.Type = sym.STYPERELRO
+ s.Size = 0
+ s.Attr |= sym.AttrReachable
+ symtyperel = s
+ } else {
+ s = ctxt.Syms.Lookup("type.*", 0)
- s.Type = sym.STYPE
- s.Size = 0
- s.Attr |= sym.AttrReachable
- symtype = s
- symtyperel = s
+ s.Type = sym.STYPE
+ s.Size = 0
+ s.Attr |= sym.AttrReachable
+ symtype = s
+ symtyperel = s
+ }
}
groupSym := func(name string, t sym.SymKind) *sym.Symbol {