1// Copyright 2021 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// Issue 44956: writable static temp is not exported correctly. 6// In the test below, package base is 7// 8// X = &map{...} 9// 10// which compiles to 11// 12// X = &stmp // static 13// stmp = makemap(...) // in init function 14// 15// plugin1 and plugin2 both import base. plugin1 doesn't use 16// base.X, so that symbol is deadcoded in plugin1. 17// 18// plugin1 is loaded first. base.init runs at that point, which 19// initialize base.stmp. 20// 21// plugin2 is then loaded. base.init already ran, so it doesn't run 22// again. When base.stmp is not exported, plugin2's base.X points to 23// its own private base.stmp, which is not initialized, fail. 24 25package main 26 27import "plugin" 28 29func main() { 30 _, err := plugin.Open("issue44956p1.so") 31 if err != nil { 32 panic("FAIL") 33 } 34 35 p2, err := plugin.Open("issue44956p2.so") 36 if err != nil { 37 panic("FAIL") 38 } 39 f, err := p2.Lookup("F") 40 if err != nil { 41 panic("FAIL") 42 } 43 x := f.(func() *map[int]int)() 44 if x == nil || (*x)[123] != 456 { 45 panic("FAIL") 46 } 47} 48