From bac083a5847a53bb726f65d6e9c2aeb54066bcf0 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Fri, 18 Aug 2023 11:10:23 -0400 Subject: [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 Run-TryBot: Cherry Mui TryBot-Result: Gopher Robot (cherry picked from commit b65e34f03814889f0edd3ddd9778864762511443) Reviewed-on: https://go-review.googlesource.com/c/go/+/520857 --- .../internal/testplugin/testdata/mangle/plugin.go | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go (limited to 'src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go') diff --git a/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go b/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go new file mode 100644 index 0000000000..e1ccb70672 --- /dev/null +++ b/src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go @@ -0,0 +1,38 @@ +// 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. + +// Test cases for symbol name mangling. + +package main + +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() {} -- cgit v1.3