aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2023-08-18 11:10:23 -0400
committerCherry Mui <cherryyz@google.com>2023-08-23 17:35:53 +0000
commitbac083a5847a53bb726f65d6e9c2aeb54066bcf0 (patch)
treeee5af6de51b7d736fc797d692ea49ad3b0b4bc8f
parent70aa116c4afe064254252a33beb82977ae8df087 (diff)
downloadgo-bac083a5847a53bb726f65d6e9c2aeb54066bcf0.tar.xz
[release-branch.go1.21] cmd/link: don't mangle string symbol names
String symbol names could contain weird characters as we put the string literal into the symbol name. So it may appear to need mangling. However, as string symbols are grouped into a single "go:string.*" symbol, the individual symbol names actually don't matter. So don't mangle them. Also make the mangling code more defensive in case of weird symbol names. Updates #62098. Fixes #62140. Change-Id: I533012567a9fffab69debda934f426421c7abb04 Reviewed-on: https://go-review.googlesource.com/c/go/+/520856 Reviewed-by: Than McIntosh <thanm@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> (cherry picked from commit b65e34f03814889f0edd3ddd9778864762511443) Reviewed-on: https://go-review.googlesource.com/c/go/+/520857
-rw-r--r--src/cmd/cgo/internal/testplugin/plugin_test.go6
-rw-r--r--src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go (renamed from src/cmd/cgo/internal/testplugin/testdata/generic/plugin.go)26
-rw-r--r--src/cmd/link/internal/ld/lib.go7
3 files changed, 31 insertions, 8 deletions
diff --git a/src/cmd/cgo/internal/testplugin/plugin_test.go b/src/cmd/cgo/internal/testplugin/plugin_test.go
index 53ccc17a07..7652167c25 100644
--- a/src/cmd/cgo/internal/testplugin/plugin_test.go
+++ b/src/cmd/cgo/internal/testplugin/plugin_test.go
@@ -389,9 +389,11 @@ func TestForkExec(t *testing.T) {
}
}
-func TestGeneric(t *testing.T) {
+func TestSymbolNameMangle(t *testing.T) {
// Issue 58800: generic function name may contain weird characters
// that confuse the external linker.
+ // Issue 62098: the name mangling code doesn't handle some string
+ // symbols correctly.
globalSkip(t)
- goCmd(t, "build", "-buildmode=plugin", "-o", "generic.so", "./generic/plugin.go")
+ goCmd(t, "build", "-buildmode=plugin", "-o", "mangle.so", "./mangle/plugin.go")
}
diff --git a/src/cmd/cgo/internal/testplugin/testdata/generic/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go
index 6d3835a7ec..e1ccb70672 100644
--- a/src/cmd/cgo/internal/testplugin/testdata/generic/plugin.go
+++ b/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go
@@ -2,21 +2,37 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Instantiated function name may contain weird characters
-// that confuse the external linker, so it needs to be
-// mangled.
+// Test cases for symbol name mangling.
package main
-//go:noinline
-func F[T any]() {}
+import (
+ "fmt"
+ "strings"
+)
+// Issue 58800:
+// Instantiated function name may contain weird characters
+// that confuse the external linker, so it needs to be
+// mangled.
type S struct {
X int `parser:"|@@)"`
}
+//go:noinline
+func F[T any]() {}
+
func P() {
F[S]()
}
+// Issue 62098: the name mangling code doesn't handle some string
+// symbols correctly.
+func G(id string) error {
+ if strings.ContainsAny(id, "&$@;/:+,?\\{^}%`]\">[~<#|") {
+ return fmt.Errorf("invalid")
+ }
+ return nil
+}
+
func main() {}
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index 91e2d5149c..d9e5774b60 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -992,6 +992,11 @@ func typeSymbolMangle(name string) string {
if strings.HasPrefix(name, "type:runtime.") {
return name
}
+ if strings.HasPrefix(name, "go:string.") {
+ // String symbols will be grouped to a single go:string.* symbol.
+ // No need to mangle individual symbol names.
+ return name
+ }
if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529
return name
}
@@ -1006,7 +1011,7 @@ func typeSymbolMangle(name string) string {
// instantiated symbol, replace type name in []
i := strings.IndexByte(name, '[')
j := strings.LastIndexByte(name, ']')
- if j == -1 {
+ if j == -1 || j <= i {
j = len(name)
}
hash := notsha256.Sum256([]byte(name[i+1 : j]))