diff --git a/src/cmd/go/testdata/script/test_fuzz_cgo.txt b/src/cmd/go/testdata/script/test_fuzz_cgo.txt new file mode 100644 index 0000000000..1a0487700d --- /dev/null +++ b/src/cmd/go/testdata/script/test_fuzz_cgo.txt @@ -0,0 +1,28 @@ +[!fuzz] skip +[!cgo] skip +[short] skip +env GOCACHE=$WORK/cache + +# Test that fuzzing works with cgo (issue 65169) + +go test -fuzz=. -fuzztime=1x +stdout ok +! stdout FAIL + +-- go.mod -- +module example.com/p + +go 1.20 +-- c.go -- +package p + +import "C" +-- c_test.go -- +package p + +import "testing" + +func Fuzz(f *testing.F) { + f.Add(0) + f.Fuzz(func(t *testing.T, x int) {}) +} diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 0550f07d5c..1104d0ea79 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1896,7 +1896,6 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".noptrbss", sym.SNOPTRBSS, sym.Sxxx, 06) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrbss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrbss", 0), sect) - ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), sect) // Code coverage counters are assigned to the .noptrbss section. // We assign them in a separate pass so that they stay aggregated @@ -1916,6 +1915,9 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("internal/fuzz._ecounters", 0), sect) } + // Assign runtime.end to the last section of data segment. + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), Segdata.Sections[len(Segdata.Sections)-1]) + if len(state.data[sym.STLSBSS]) > 0 { var sect *sym.Section // FIXME: not clear why it is sometimes necessary to suppress .tbss section creation.