From 2b92c39fe08101ed8c9f032d577df4cc882d08d7 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 12 Jan 2023 20:25:39 -0800 Subject: cmd/link: establish dependable package initialization order (This is a retry of CL 462035 which was reverted at 474976. The only change from that CL is the aix fix SRODATA->SNOPTRDATA at inittask.go:141) As described here: https://github.com/golang/go/issues/31636#issuecomment-493271830 "Find the lexically earliest package that is not initialized yet, but has had all its dependencies initialized, initialize that package, and repeat." Simplify the runtime a bit, by just computing the ordering required in the linker and giving a list to the runtime. Update #31636 Fixes #57411 RELNOTE=yes Change-Id: I28c09451d6aa677d7394c179d23c2c02c503fc56 Reviewed-on: https://go-review.googlesource.com/c/go/+/478916 Reviewed-by: Than McIntosh Reviewed-by: Cherry Mui Run-TryBot: Keith Randall TryBot-Result: Gopher Robot --- src/runtime/plugin.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/runtime/plugin.go') diff --git a/src/runtime/plugin.go b/src/runtime/plugin.go index a61dcc3b5d..312802de00 100644 --- a/src/runtime/plugin.go +++ b/src/runtime/plugin.go @@ -7,7 +7,7 @@ package runtime import "unsafe" //go:linkname plugin_lastmoduleinit plugin.lastmoduleinit -func plugin_lastmoduleinit() (path string, syms map[string]any, errstr string) { +func plugin_lastmoduleinit() (path string, syms map[string]any, initTasks []*initTask, errstr string) { var md *moduledata for pmd := firstmoduledata.next; pmd != nil; pmd = pmd.next { if pmd.bad { @@ -23,13 +23,13 @@ func plugin_lastmoduleinit() (path string, syms map[string]any, errstr string) { throw("runtime: plugin has empty pluginpath") } if md.typemap != nil { - return "", nil, "plugin already loaded" + return "", nil, nil, "plugin already loaded" } for _, pmd := range activeModules() { if pmd.pluginpath == md.pluginpath { md.bad = true - return "", nil, "plugin already loaded" + return "", nil, nil, "plugin already loaded" } if inRange(pmd.text, pmd.etext, md.text, md.etext) || @@ -51,7 +51,7 @@ func plugin_lastmoduleinit() (path string, syms map[string]any, errstr string) { for _, pkghash := range md.pkghashes { if pkghash.linktimehash != *pkghash.runtimehash { md.bad = true - return "", nil, "plugin was built with a different version of package " + pkghash.modulename + return "", nil, nil, "plugin was built with a different version of package " + pkghash.modulename } } @@ -90,7 +90,7 @@ func plugin_lastmoduleinit() (path string, syms map[string]any, errstr string) { } syms[name] = val } - return md.pluginpath, syms, "" + return md.pluginpath, syms, md.inittasks, "" } func pluginftabverify(md *moduledata) { -- cgit v1.3