aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/testdata
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2025-05-21 14:32:21 -0400
committerCherry Mui <cherryyz@google.com>2025-05-28 11:59:46 -0700
commit70109eb32625487d9c774d602a4fa2422e218f1b (patch)
treeec91796754d1703244694e3cc93f95e11dfd249c /src/cmd/link/testdata
parenteff328804253e40a2de9c5d89cf7a7c1e23aa11d (diff)
downloadgo-70109eb32625487d9c774d602a4fa2422e218f1b.tar.xz
cmd/link: allow linkname reference to a TEXT symbol regardless of size
In CL 660696, we made the linker to choose the symbol of the larger size in case there are multiple contentless declarations of the same symbol. We also made it emit an error in the case that there are a contentless declaration of a larger size and a definition with content of a smaller size. In this case, we should choose the definition with content, but the code accesses it through the declaration of the larger size could fall into the next symbol, potentially causing data corruption. So we disallowed it. There is one spcial case, though, that some code uses a linknamed variable declaration to reference a function in assembly, in order to take its address. The variable is often declared as uintptr. The function symbol is the definition, which could sometimes be shorter. This would trigger the error case above, causing existing code failing to build. This CL allows it as a special case. It is still not safe to access the variable's content. But it is actually okay to just take its address, which the existing code often do. Fixes #73617. Change-Id: I467381bc5f6baa16caee6752a0a824c7185422f6 Reviewed-on: https://go-review.googlesource.com/c/go/+/676636 Reviewed-by: David Chase <drchase@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/cmd/link/testdata')
-rw-r--r--src/cmd/link/testdata/linkname/textvar/asm.s6
-rw-r--r--src/cmd/link/testdata/linkname/textvar/main.go17
2 files changed, 23 insertions, 0 deletions
diff --git a/src/cmd/link/testdata/linkname/textvar/asm.s b/src/cmd/link/testdata/linkname/textvar/asm.s
new file mode 100644
index 0000000000..332dcdb4e7
--- /dev/null
+++ b/src/cmd/link/testdata/linkname/textvar/asm.s
@@ -0,0 +1,6 @@
+// Copyright 2024 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.
+
+TEXT ·asmfunc(SB),0,$0-0
+ RET
diff --git a/src/cmd/link/testdata/linkname/textvar/main.go b/src/cmd/link/testdata/linkname/textvar/main.go
new file mode 100644
index 0000000000..b38995e706
--- /dev/null
+++ b/src/cmd/link/testdata/linkname/textvar/main.go
@@ -0,0 +1,17 @@
+// Copyright 2024 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.
+
+// Using a linknamed variable to reference an assembly
+// function in the same package is ok.
+
+package main
+
+import _ "unsafe"
+
+func main() {
+ println(&asmfunc)
+}
+
+//go:linkname asmfunc
+var asmfunc uintptr