diff options
author | David Crawshaw <crawshaw@golang.org> | 2016-10-30 21:19:59 -0400 |
---|---|---|
committer | David Crawshaw <crawshaw@golang.org> | 2016-10-31 04:49:52 +0000 |
commit | f4c7a12c2c4b0aef99b4957a778736a4da9ae4ec (patch) | |
tree | c5e6ba761e54e38dc8904a3d75f683a4d7817ab8 /src/runtime/type.go | |
parent | 9da7058466c8c9f32e1481f28d57732832ee3b30 (diff) | |
download | go-f4c7a12c2c4b0aef99b4957a778736a4da9ae4ec.tar.gz go-f4c7a12c2c4b0aef99b4957a778736a4da9ae4ec.zip |
runtime: make module typemaps visible to the GC
The map[typeOff]*_type object is created at run time and stored in
the moduledata. The moduledata object is marked by the linker as
SNOPTRDATA, so the reference is ignored by the GC. Running
misc/cgo/testplugin/test.bash with GOGC=1 will eventually collect
the typemap and crash.
This bug probably comes up in -linkshared binaries in Go 1.7.
I don't know why we haven't seen a report about this yet.
Fixes #17680
Change-Id: I0e9b5c006010e8edd51d9471651620ba665248d3
Reviewed-on: https://go-review.googlesource.com/32430
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Hudson-Doyle <michael.hudson@canonical.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/type.go')
-rw-r--r-- | src/runtime/type.go | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/runtime/type.go b/src/runtime/type.go index 7f7849d5a0..cacf880e9e 100644 --- a/src/runtime/type.go +++ b/src/runtime/type.go @@ -497,7 +497,9 @@ func typelinksinit() { // If any of this module's typelinks match a type from a // prior module, prefer that prior type by adding the offset // to this module's typemap. - md.typemap = make(map[typeOff]*_type, len(md.typelinks)) + tm := make(map[typeOff]*_type, len(md.typelinks)) + pinnedTypemaps = append(pinnedTypemaps, tm) + md.typemap = tm for _, tl := range md.typelinks { t := (*_type)(unsafe.Pointer(md.types + uintptr(tl))) for _, candidate := range typehash[t.hash] { |