aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2026-01-02 13:42:00 -0800
committerKeith Randall <khr@golang.org>2026-02-06 15:22:38 -0800
commit4fe1203111eeda8a38af4f2a4208e4d4de720c0d (patch)
tree427f5d03924febf5ce2a68a6a60360644c533ea4 /src/cmd
parentcbb37e310e2edd7148c8501567e190746e6d98d2 (diff)
downloadgo-4fe1203111eeda8a38af4f2a4208e4d4de720c0d.tar.xz
cmd/link: align covctrs symbol
If we start the covctrs blob at an odd alignment, then covctrs will not be correctly aligned. Each individual entry is aligned properly, but the start marker may be before any padding inserted to enforce that alignment. Fixes #58936 Change-Id: I802fbe40eacfa5a3c8c4864e078b0e078da956d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/733740 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/cover/cover_test.go9
-rw-r--r--src/cmd/cover/testdata/align.go11
-rw-r--r--src/cmd/cover/testdata/align_test.go10
-rw-r--r--src/cmd/link/internal/ld/data.go7
4 files changed, 37 insertions, 0 deletions
diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go
index a1149e9e6e..a19e0d0924 100644
--- a/src/cmd/cover/cover_test.go
+++ b/src/cmd/cover/cover_test.go
@@ -638,3 +638,12 @@ func main() {
t.Errorf("unexpected success; want failure due to newline in file path")
}
}
+
+func TestAlignment(t *testing.T) {
+ // Test that cover data structures are aligned appropriately. See issue 58936.
+ testenv.MustHaveGoRun(t)
+ t.Parallel()
+
+ cmd := testenv.Command(t, testenv.GoToolPath(t), "test", "-cover", filepath.Join(testdata, "align.go"), filepath.Join(testdata, "align_test.go"))
+ run(cmd, t)
+}
diff --git a/src/cmd/cover/testdata/align.go b/src/cmd/cover/testdata/align.go
new file mode 100644
index 0000000000..2e8a45345d
--- /dev/null
+++ b/src/cmd/cover/testdata/align.go
@@ -0,0 +1,11 @@
+// Copyright 2026 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 p
+
+var badSlice [8265]byte
+
+func init() {
+ badSlice[0] = 4
+}
diff --git a/src/cmd/cover/testdata/align_test.go b/src/cmd/cover/testdata/align_test.go
new file mode 100644
index 0000000000..e908c5a1cb
--- /dev/null
+++ b/src/cmd/cover/testdata/align_test.go
@@ -0,0 +1,10 @@
+// Copyright 2026 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 p
+
+import "testing"
+
+func TestFoo(t *testing.T) {
+}
diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go
index 683df3bb67..a045ff5eea 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -2022,6 +2022,13 @@ func (state *dodataState) allocateDataSections(ctxt *Link) {
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.covctrs", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ecovctrs", 0), sect)
+ // If we started this blob at an odd alignment, then covctrs will
+ // not be correctly aligned. Each individual entry is aligned properly,
+ // but the start marker may be before any padding inserted to enforce
+ // that alignment. Fix that here. See issue 58936.
+ covCounterDataStartOff += covCounterDataLen % 4
+ covCounterDataLen -= covCounterDataLen % 4
+
// Coverage instrumentation counters for libfuzzer.
if len(state.data[sym.SLIBFUZZER_8BIT_COUNTER]) > 0 {
sect := state.allocateNamedSectionAndAssignSyms(&Segdata, ".go.fuzzcntrs", sym.SLIBFUZZER_8BIT_COUNTER, sym.Sxxx, 06)