Skip to content

Commit

Permalink
[release-branch.go1.17] cmd/link: mark unexported methods for plugins
Browse files Browse the repository at this point in the history
When plugin is used, we already mark all exported methods
reachable. However, when the plugin and the host program share
a common package, an unexported method could also be reachable
from both the plugin and the host via interfaces. We need to mark
them as well.

Fixes #51736.
Updates #51621.

Change-Id: I1a70d3f96b66b803f2d0ab14d00ed0df276ea500
Reviewed-on: https://go-review.googlesource.com/c/go/+/393365
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
(cherry picked from commit 91631bc)
Reviewed-on: https://go-review.googlesource.com/c/go/+/397484
  • Loading branch information
cherrymui committed Apr 4, 2022
1 parent 4e69fdd commit eb75219
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 1 deletion.
6 changes: 6 additions & 0 deletions misc/cgo/testplugin/plugin_test.go
Expand Up @@ -287,6 +287,12 @@ func TestMethod2(t *testing.T) {
run(t, "./method2.exe")
}

func TestMethod3(t *testing.T) {
goCmd(t, "build", "-buildmode=plugin", "-o", "method3.so", "./method3/plugin.go")
goCmd(t, "build", "-o", "method3.exe", "./method3/main.go")
run(t, "./method3.exe")
}

func TestIssue44956(t *testing.T) {
goCmd(t, "build", "-buildmode=plugin", "-o", "issue44956p1.so", "./issue44956/plugin1.go")
goCmd(t, "build", "-buildmode=plugin", "-o", "issue44956p2.so", "./issue44956/plugin2.go")
Expand Down
32 changes: 32 additions & 0 deletions misc/cgo/testplugin/testdata/method3/main.go
@@ -0,0 +1,32 @@
// Copyright 2022 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.

// An unexported method can be reachable from the plugin via interface
// when a package is shared. So it need to be live.

package main

import (
"plugin"

"testplugin/method3/p"
)

var i p.I

func main() {
pl, err := plugin.Open("method3.so")
if err != nil {
panic(err)
}

f, err := pl.Lookup("F")
if err != nil {
panic(err)
}

f.(func())()

i = p.T(123)
}
17 changes: 17 additions & 0 deletions misc/cgo/testplugin/testdata/method3/p/p.go
@@ -0,0 +1,17 @@
// Copyright 2022 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 p

type T int

func (T) m() { println("m") }

type I interface { m() }

func F() {
i.m()
}

var i I = T(123)
11 changes: 11 additions & 0 deletions misc/cgo/testplugin/testdata/method3/plugin.go
@@ -0,0 +1,11 @@
// Copyright 2022 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 "testplugin/method3/p"

func main() {}

func F() { p.F() }
2 changes: 1 addition & 1 deletion src/cmd/link/internal/ld/deadcode.go
Expand Up @@ -350,7 +350,7 @@ func deadcode(ctxt *Link) {
// in the last pass.
rem := d.markableMethods[:0]
for _, m := range d.markableMethods {
if (d.reflectSeen && m.isExported()) || d.ifaceMethod[m.m] {
if (d.reflectSeen && (m.isExported() || d.dynlink)) || d.ifaceMethod[m.m] {
d.markMethod(m)
} else {
rem = append(rem, m)
Expand Down

0 comments on commit eb75219

Please sign in to comment.