From c58b98b2d617ab2dfe839c4e5ef1e2008c9b60cf Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Mon, 9 Oct 2017 16:04:44 -0400 Subject: cmd/link, runtime: put hasmain bit in moduledata Currently we look to see if the main.main symbol address is in the module data text range. This requires access to the main.main symbol, which usually the runtime has, but does not when building a plugin. To avoid a dynamic relocation to main.main (which I haven't worked out how to have the linker generate on darwin), stop using the symbol. Instead record a boolean in the moduledata if the module has the main function. Fixes #22175 Change-Id: If313a118f17ab499d0a760bbc2519771ed654530 Reviewed-on: https://go-review.googlesource.com/69370 Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/testplugin/src/issue22175/main.go | 28 +++++++++++++++++++++++++++ misc/cgo/testplugin/src/issue22175/plugin1.go | 21 ++++++++++++++++++++ misc/cgo/testplugin/src/issue22175/plugin2.go | 9 +++++++++ 3 files changed, 58 insertions(+) create mode 100644 misc/cgo/testplugin/src/issue22175/main.go create mode 100644 misc/cgo/testplugin/src/issue22175/plugin1.go create mode 100644 misc/cgo/testplugin/src/issue22175/plugin2.go (limited to 'misc/cgo/testplugin/src') diff --git a/misc/cgo/testplugin/src/issue22175/main.go b/misc/cgo/testplugin/src/issue22175/main.go new file mode 100644 index 0000000000..9be9bab9dc --- /dev/null +++ b/misc/cgo/testplugin/src/issue22175/main.go @@ -0,0 +1,28 @@ +// Copyright 2017 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 ( + "fmt" + "os" + "plugin" +) + +func main() { + p2, err := plugin.Open("issue22175_plugin1.so") + if err != nil { + panic(err) + } + f, err := p2.Lookup("F") + if err != nil { + panic(err) + } + got := f.(func() int)() + const want = 971 + if got != want { + fmt.Fprintf(os.Stderr, "issue22175: F()=%d, want %d", got, want) + os.Exit(1) + } +} diff --git a/misc/cgo/testplugin/src/issue22175/plugin1.go b/misc/cgo/testplugin/src/issue22175/plugin1.go new file mode 100644 index 0000000000..5ae6cb631e --- /dev/null +++ b/misc/cgo/testplugin/src/issue22175/plugin1.go @@ -0,0 +1,21 @@ +// Copyright 2017 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 "plugin" + +func F() int { + p2, err := plugin.Open("issue22175_plugin2.so") + if err != nil { + panic(err) + } + g, err := p2.Lookup("G") + if err != nil { + panic(err) + } + return g.(func() int)() +} + +func main() {} diff --git a/misc/cgo/testplugin/src/issue22175/plugin2.go b/misc/cgo/testplugin/src/issue22175/plugin2.go new file mode 100644 index 0000000000..f387a192e6 --- /dev/null +++ b/misc/cgo/testplugin/src/issue22175/plugin2.go @@ -0,0 +1,9 @@ +// Copyright 2017 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 + +func G() int { return 971 } + +func main() {} -- cgit v1.3-5-g9baa