mirror of https://github.com/golang/go.git
[release-branch.go1.22] cmd/link: put runtime.end in the last section of data segment
Currently the runtime.end symbol is put into the noptrbss section,
which is usually the last section, except that when fuzzing is
enabled, the last section is actually .go.fuzzcntrs. The
runtime.end symbol has the value pointing to the end of the data
segment, so if it is not in the last section, the value will not
actually be in the range of the section. This causes an assertion
failure in the new Apple linker. This CL fixes this by putting it
in the last section.
Updates #65169.
Fixes #67945.
Change-Id: I5c991c46a0483a96e5f6e0255a3b444953676026
Reviewed-on: https://go-review.googlesource.com/c/go/+/592095
Reviewed-by: Than McIntosh <thanm@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit b589478af7)
Reviewed-on: https://go-review.googlesource.com/c/go/+/592478
This commit is contained in:
parent
179ccb7042
commit
4c97e883b5
|
|
@ -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) {})
|
||||
}
|
||||
|
|
@ -1915,7 +1915,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
|
||||
|
|
@ -1935,6 +1934,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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue