mirror of
https://github.com/golang/go
synced 2024-11-08 00:26:18 -07:00
7a1e963058
Static tmps are private to a package, but with plugins a package can be shared among multiple DSOs. They need to have a consistent view of the static tmps, especially for writable ones. So export them. (Read-only static tmps have the same values anyway, so it doesn't matter. Also Mach-O doesn't support dynamically exporting read-only symbols anyway.) Fixes #44956. Change-Id: I921e25b7ab73cd5d5347800eccdb7931e3448779 Reviewed-on: https://go-review.googlesource.com/c/go/+/301793 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
// 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.
|
|
|
|
// Issue 44956: writable static temp is not exported correctly.
|
|
// In the test below, package base is
|
|
//
|
|
// X = &map{...}
|
|
//
|
|
// which compiles to
|
|
//
|
|
// X = &stmp // static
|
|
// stmp = makemap(...) // in init function
|
|
//
|
|
// plugin1 and plugin2 both import base. plugin1 doesn't use
|
|
// base.X, so that symbol is deadcoded in plugin1.
|
|
//
|
|
// plugin1 is loaded first. base.init runs at that point, which
|
|
// initialize base.stmp.
|
|
//
|
|
// plugin2 is then loaded. base.init already ran, so it doesn't run
|
|
// again. When base.stmp is not exported, plugin2's base.X points to
|
|
// its own private base.stmp, which is not initialized, fail.
|
|
|
|
package main
|
|
|
|
import "plugin"
|
|
|
|
func main() {
|
|
_, err := plugin.Open("issue44956p1.so")
|
|
if err != nil {
|
|
panic("FAIL")
|
|
}
|
|
|
|
p2, err := plugin.Open("issue44956p2.so")
|
|
if err != nil {
|
|
panic("FAIL")
|
|
}
|
|
f, err := p2.Lookup("F")
|
|
if err != nil {
|
|
panic("FAIL")
|
|
}
|
|
x := f.(func() *map[int]int)()
|
|
if x == nil || (*x)[123] != 456 {
|
|
panic("FAIL")
|
|
}
|
|
}
|