]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.17] cmd/link: disable weak reference in itab if build with "...
authorzhouguangyuan <zhouguangyuan.xian@gmail.com>
Wed, 15 Sep 2021 18:10:17 +0000 (02:10 +0800)
committerDmitri Shuralyov <dmitshur@golang.org>
Thu, 28 Oct 2021 16:34:40 +0000 (16:34 +0000)
When build with "-linkshared", we can't tell if the interface method will be used or not. It can be used in shared library.
This CL backport this fix to 1.17.

Fixes #49086

Change-Id: Iba12812f199b7679cf2fd41a304268d6d6dd03c6
Reviewed-on: https://go-review.googlesource.com/c/go/+/350189
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Alexander Rakoczy <alex@golang.org>
(cherry picked from commit f687831e4cfa06d19533d47ae93c0451bd1ca688)
Reviewed-on: https://go-review.googlesource.com/c/go/+/357231
Trust: Ian Lance Taylor <iant@golang.org>

misc/cgo/testshared/shared_test.go
misc/cgo/testshared/testdata/issue47837/a/a.go [new file with mode: 0644]
misc/cgo/testshared/testdata/issue47837/main/main.go [new file with mode: 0644]
src/cmd/link/internal/ld/deadcode.go

index e77f84891543f584ccb5bd2aa538f0e6237e9d17..0568ac773fee54148d807c41489f6534c4d3b14b 100644 (file)
@@ -1070,3 +1070,11 @@ func TestIssue44031(t *testing.T) {
        goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue44031/b")
        goCmd(t, "run", "-linkshared", "./issue44031/main")
 }
+
+// Test that we use a variable from shared libraries (which implement an
+// interface in shared libraries.). A weak reference is used in the itab
+// in main process. It can cause unreacheble panic. See issue 47873.
+func TestIssue47873(t *testing.T) {
+       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue47837/a")
+       goCmd(t, "run", "-linkshared", "./issue47837/main")
+}
diff --git a/misc/cgo/testshared/testdata/issue47837/a/a.go b/misc/cgo/testshared/testdata/issue47837/a/a.go
new file mode 100644 (file)
index 0000000..68588ed
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type A interface {
+       M()
+}
+
+//go:noinline
+func TheFuncWithArgA(a A) {
+       a.M()
+}
+
+type ImplA struct{}
+
+//go:noinline
+func (A *ImplA) M() {}
diff --git a/misc/cgo/testshared/testdata/issue47837/main/main.go b/misc/cgo/testshared/testdata/issue47837/main/main.go
new file mode 100644 (file)
index 0000000..77c6f34
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "testshared/issue47837/a"
+)
+
+func main() {
+       var vara a.ImplA
+       a.TheFuncWithArgA(&vara)
+}
index 416e5da39838fe73a68f663c6914869571a444ba..e4fa75f8e121fd816af85cc4aa8dd5a7c7f3ae13 100644 (file)
@@ -132,7 +132,9 @@ func (d *deadcodePass) flood() {
                methods = methods[:0]
                for i := 0; i < relocs.Count(); i++ {
                        r := relocs.At(i)
-                       if r.Weak() {
+                       // When build with "-linkshared", we can't tell if the interface
+                       // method in itab will be used or not. Ignore the weak attribute.
+                       if r.Weak() && !(d.ctxt.linkShared && d.ldr.IsItab(symIdx)) {
                                continue
                        }
                        t := r.Type()