mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile: make sure linkname'd symbol is non-package
When a variable symbol is both imported (possibly through inlining) and linkname'd, make sure its LSym is marked as non-package for symbol indexing in the object file, so it is resolved by name and dedup'd with the original definition. Fixes #42401. Change-Id: I8e90c0418c6f46a048945c5fdc06c022b77ed68d Reviewed-on: https://go-review.googlesource.com/c/go/+/268178 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
parent
979e137609
commit
a444458112
@ -302,6 +302,12 @@ func ggloblnod(nam *Node) {
|
||||
if nam.Name.LibfuzzerExtraCounter() {
|
||||
s.Type = objabi.SLIBFUZZER_EXTRA_COUNTER
|
||||
}
|
||||
if nam.Sym.Linkname != "" {
|
||||
// Make sure linkname'd symbol is non-package. When a symbol is
|
||||
// both imported and linkname'd, s.Pkg may not set to "_" in
|
||||
// types.Sym.Linksym because LSym already exists. Set it here.
|
||||
s.Pkg = "_"
|
||||
}
|
||||
}
|
||||
|
||||
func ggloblsym(s *obj.LSym, width int32, flags int16) {
|
||||
|
11
test/fixedbugs/issue42401.dir/a.go
Normal file
11
test/fixedbugs/issue42401.dir/a.go
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2020 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 a
|
||||
|
||||
var s string
|
||||
|
||||
func init() { s = "a" }
|
||||
|
||||
func Get() string { return s }
|
24
test/fixedbugs/issue42401.dir/b.go
Normal file
24
test/fixedbugs/issue42401.dir/b.go
Normal file
@ -0,0 +1,24 @@
|
||||
// Copyright 2020 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 (
|
||||
"./a"
|
||||
_ "unsafe"
|
||||
)
|
||||
|
||||
//go:linkname s a.s
|
||||
var s string
|
||||
|
||||
func main() {
|
||||
if a.Get() != "a" {
|
||||
panic("FAIL")
|
||||
}
|
||||
|
||||
s = "b"
|
||||
if a.Get() != "b" {
|
||||
panic("FAIL")
|
||||
}
|
||||
}
|
10
test/fixedbugs/issue42401.go
Normal file
10
test/fixedbugs/issue42401.go
Normal file
@ -0,0 +1,10 @@
|
||||
// rundir
|
||||
|
||||
// Copyright 2020 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.
|
||||
|
||||
// Issue 42401: linkname doesn't work correctly when a variable symbol
|
||||
// is both imported (possibly through inlining) and linkname'd.
|
||||
|
||||
package ignored
|
Loading…
x
Reference in New Issue
Block a user