Date
1 - 1 of 1
[PATCH] go: fix some linkshared regression introduced in go 1.20
Jose Quaresma
Since go 1.20 some packages fails to link [1][2]
and only build staticaly with GO_LINKSHARED = "" [1] https://lists.yoctoproject.org/g/meta-virtualization/topic/97182310 [2] https://github.com/golang/go/issues/58966 Signed-off-by: Jose Quaresma <jose.quaresma@...> --- meta/recipes-devtools/go/go-1.20.1.inc | 1 + ...ompile-instantiated-generic-methods-.patch | 90 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 meta/recipes-devtools/go/go/0010-cmd-compile-re-compile-instantiated-generic-methods-.patch diff --git a/meta/recipes-devtools/go/go-1.20.1.inc b/meta/recipes-devtools/go/go-1.20.1.inc index aa3e2dadf1..ffde7ed732 100644 --- a/meta/recipes-devtools/go/go-1.20.1.inc +++ b/meta/recipes-devtools/go/go-1.20.1.inc @@ -14,5 +14,6 @@ SRC_URI += "\ file://0007-exec.go-do-not-write-linker-flags-into-buildids.patch \ file://0008-src-cmd-dist-buildgo.go-do-not-hardcode-host-compile.patch \ file://0009-go-Filter-build-paths-on-staticly-linked-arches.patch \ + file://0010-cmd-compile-re-compile-instantiated-generic-methods-.patch \ " SRC_URI[main.sha256sum] = "b5c1a3af52c385a6d1c76aed5361cf26459023980d0320de7658bae3915831a2" diff --git a/meta/recipes-devtools/go/go/0010-cmd-compile-re-compile-instantiated-generic-methods-.patch b/meta/recipes-devtools/go/go/0010-cmd-compile-re-compile-instantiated-generic-methods-.patch new file mode 100644 index 0000000000..f9ac202421 --- /dev/null +++ b/meta/recipes-devtools/go/go/0010-cmd-compile-re-compile-instantiated-generic-methods-.patch @@ -0,0 +1,90 @@ +From 7a3bb16b43efba73674629eae4369f9004e37f22 Mon Sep 17 00:00:00 2001 +From: Cuong Manh Le <cuong.manhle.vn@...> +Date: Sat, 18 Mar 2023 00:53:07 +0700 +Subject: [PATCH] cmd/compile: re-compile instantiated generic methods in + linkshared mode + +For G[T] that was seen and compiled in imported package, it is not added +to typecheck.Target.Decls, prevent wasting compile time re-creating +DUPOKS symbols. However, the linker do not support a type symbol +referencing a method symbol across DSO boundary. That causes unreachable +sym error when building under -linkshared mode. + +To fix it, always re-compile generic methods in linkshared mode. + +Fixes #58966 + +Change-Id: I894b417cfe8234ae1fe809cc975889345df22cef +Reviewed-on: https://go-review.googlesource.com/c/go/+/477375 +Run-TryBot: Cuong Manh Le <cuong.manhle.vn@...> +Reviewed-by: Cherry Mui <cherryyz@...> +Reviewed-by: Matthew Dempsky <mdempsky@...> +TryBot-Result: Gopher Robot <gobot@...> + +Upstream-Status: Backport [https://github.com/golang/go/commit/bcd82125f85c7c552493e863fa1bb14e6c444557] + +Signed-off-by: Jose Quaresma <jose.quaresma@...> +--- + misc/cgo/testshared/shared_test.go | 7 ++++++- + misc/cgo/testshared/testdata/issue58966/main.go | 15 +++++++++++++++ + src/cmd/compile/internal/noder/unified.go | 6 +++++- + 3 files changed, 26 insertions(+), 2 deletions(-) + create mode 100644 misc/cgo/testshared/testdata/issue58966/main.go + +diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go +index b14fb1cb3a..03da8f9435 100644 +--- a/misc/cgo/testshared/shared_test.go ++++ b/misc/cgo/testshared/shared_test.go +@@ -1112,8 +1112,13 @@ func TestStd(t *testing.T) { + t.Skip("skip in short mode") + } + t.Parallel() ++ tmpDir := t.TempDir() + // Use a temporary pkgdir to not interfere with other tests, and not write to GOROOT. + // Cannot use goCmd as it runs with cloned GOROOT which is incomplete. + runWithEnv(t, "building std", []string{"GOROOT=" + oldGOROOT}, +- filepath.Join(oldGOROOT, "bin", "go"), "install", "-buildmode=shared", "-pkgdir="+t.TempDir(), "std") ++ filepath.Join(oldGOROOT, "bin", "go"), "install", "-buildmode=shared", "-pkgdir="+tmpDir, "std") ++ ++ // Issue #58966. ++ runWithEnv(t, "testing issue #58966", []string{"GOROOT=" + oldGOROOT}, ++ filepath.Join(oldGOROOT, "bin", "go"), "run", "-linkshared", "-pkgdir="+tmpDir, "./issue58966/main.go") + } +diff --git a/misc/cgo/testshared/testdata/issue58966/main.go b/misc/cgo/testshared/testdata/issue58966/main.go +new file mode 100644 +index 0000000000..2d923c3607 +--- /dev/null ++++ b/misc/cgo/testshared/testdata/issue58966/main.go +@@ -0,0 +1,15 @@ ++// Copyright 2023 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 "crypto/elliptic" ++ ++var curve elliptic.Curve ++ ++func main() { ++ switch curve { ++ case elliptic.P224(): ++ } ++} +diff --git a/src/cmd/compile/internal/noder/unified.go b/src/cmd/compile/internal/noder/unified.go +index ed97a09302..25136e6aad 100644 +--- a/src/cmd/compile/internal/noder/unified.go ++++ b/src/cmd/compile/internal/noder/unified.go +@@ -158,7 +158,11 @@ func readBodies(target *ir.Package, duringInlining bool) { + // Instantiated generic function: add to Decls for typechecking + // and compilation. + if fn.OClosure == nil && len(pri.dict.targs) != 0 { +- if duringInlining { ++ // cmd/link does not support a type symbol referencing a method symbol ++ // across DSO boundary, so force re-compiling methods on a generic type ++ // even it was seen from imported package in linkshared mode, see #58966. ++ canSkipNonGenericMethod := !(base.Ctxt.Flag_linkshared && ir.IsMethod(fn)) ++ if duringInlining && canSkipNonGenericMethod { + inlDecls = append(inlDecls, fn) + } else { + target.Decls = append(target.Decls, fn) -- 2.34.1 |
|