From 1ceb72394e250d5776726bba63c34cd2be5745d1 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Thu, 7 Oct 2021 16:33:43 -0400 Subject: [PATCH] cmd/link: mark holes in functab with end PC-1 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 Trust: Josh Bleecher Snyder Run-TryBot: Cherry Mui TryBot-Result: Go Bot Reviewed-by: Josh Bleecher Snyder --- src/cmd/link/internal/ld/pcln.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index ee26ee27a0..465c52b6cf 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -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 -- 2.50.0