]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: mark holes in functab with end PC-1
authorCherry Mui <cherryyz@google.com>
Thu, 7 Oct 2021 20:33:43 +0000 (16:33 -0400)
committerCherry Mui <cherryyz@google.com>
Thu, 7 Oct 2021 22:19:58 +0000 (22:19 +0000)
When we have multiple text sections, we need to mark holes between
the sections in the functab. A hole is marked with an entry with
the end PC of the previous section. As we now use offsets instead
of (relocated) PCs, the end offset of a section may be the same of
the start of the next one. Distinguish it by using the end address
-1.

For #48837.

Change-Id: I121aac53b32a869378632cf151cb1b6f98ad3089
Reviewed-on: https://go-review.googlesource.com/c/go/+/354636
Trust: Cherry Mui <cherryyz@google.com>
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/link/internal/ld/pcln.go

index ee26ee27a0f7f595d4b751a03f10f85b891d1e06..465c52b6cf07111697be5daef399fbfdbce15647 100644 (file)
@@ -631,9 +631,11 @@ func writePCToFunc(ctxt *Link, sb *loader.SymbolBuilder, funcs []loader.Sym, sta
                if thisSect := ldr.SymSect(s); thisSect != prevSect {
                        // With multiple text sections, there may be a hole here in the
                        // address space. We use an invalid funcoff value to mark the hole.
+                       // Use the end PC - 1 to distinguish the end of a section vs. the
+                       // start of the next.
                        // See also runtime/symtab.go:findfunc
                        prevFuncSize := uint32(ldr.SymSize(prevFunc))
-                       sb.SetUint32(ctxt.Arch, int64(funcIndex*2*4), pcOff(prevFunc)+prevFuncSize)
+                       sb.SetUint32(ctxt.Arch, int64(funcIndex*2*4), pcOff(prevFunc)+prevFuncSize-1)
                        sb.SetUint32(ctxt.Arch, int64((funcIndex*2+1)*4), ^uint32(0))
                        funcIndex++
                        prevSect = thisSect