aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/ld/lib.go
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2023-06-01 17:35:28 -0400
committerCherry Mui <cherryyz@google.com>2023-06-09 16:00:05 +0000
commit5e9b76fe2a1c6709e710c985ae82dff90c847c54 (patch)
tree813e6da0e1bd8ac9a7e36bf2f79dcff10a5ee4d8 /src/cmd/link/internal/ld/lib.go
parent6801c27837b44b40aef0878a8a611413ef46e3eb (diff)
downloadgo-5e9b76fe2a1c6709e710c985ae82dff90c847c54.tar.xz
cmd/link: mangle certain instantiated function name in plugin mode
In plugin mode, we mangle the type symbol name so it doesn't contain characters that may confuse the external linker. With generics, instantiated function name includes type names, so it may also contain such characters and so also needs to be mangled. Fixes #58800. Change-Id: Ibb08c95b89b8a815ccef98193d3a025e9d4756cc Reviewed-on: https://go-review.googlesource.com/c/go/+/500095 Reviewed-by: Than McIntosh <thanm@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/cmd/link/internal/ld/lib.go')
-rw-r--r--src/cmd/link/internal/ld/lib.go24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index 54021b69f4..91e2d5149c 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -984,7 +984,9 @@ func (ctxt *Link) mangleTypeSym() {
// Leave type:runtime. symbols alone, because other parts of
// the linker manipulates them.
func typeSymbolMangle(name string) string {
- if !strings.HasPrefix(name, "type:") {
+ isType := strings.HasPrefix(name, "type:")
+ if !isType && !strings.Contains(name, "@") {
+ // Issue 58800: instantiated symbols may include a type name, which may contain "@"
return name
}
if strings.HasPrefix(name, "type:runtime.") {
@@ -993,12 +995,22 @@ func typeSymbolMangle(name string) string {
if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529
return name
}
- hash := notsha256.Sum256([]byte(name))
- prefix := "type:"
- if name[5] == '.' {
- prefix = "type:."
+ if isType {
+ hash := notsha256.Sum256([]byte(name[5:]))
+ prefix := "type:"
+ if name[5] == '.' {
+ prefix = "type:."
+ }
+ return prefix + base64.StdEncoding.EncodeToString(hash[:6])
+ }
+ // instantiated symbol, replace type name in []
+ i := strings.IndexByte(name, '[')
+ j := strings.LastIndexByte(name, ']')
+ if j == -1 {
+ j = len(name)
}
- return prefix + base64.StdEncoding.EncodeToString(hash[:6])
+ hash := notsha256.Sum256([]byte(name[i+1 : j]))
+ return name[:i+1] + base64.StdEncoding.EncodeToString(hash[:6]) + name[j:]
}
/*