From 99e1e4f657c24769a2b42a4aa26c226b6e1db915 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Tue, 17 Jan 2017 15:06:12 +1100 Subject: [PATCH] cmd/link: assume that runtime.epclntab lives in .text section Sometimes STEXT symbols point to the first byte of .data section, instead of the end of .text section. But, while writing pe symbol table, we should treat them as if they belong to the .text section. Change pe symbol table records for these symbols. Fixes #14710 Change-Id: I1356e61aa8fa37d590d7b1677b2bac214ad0ba4e Reviewed-on: https://go-review.googlesource.com/35272 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/pe.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 517ed6cf2a..06fe49369f 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -955,10 +955,12 @@ func writePESymTableRecords(ctxt *Link) int { var value int64 // Note: although address of runtime.edata (type SDATA) is at the start of .bss section // it still belongs to the .data section, not the .bss section. + // Same for runtime.epclntab (type STEXT), it belongs to .text + // section, not the .data section. if uint64(s.Value) >= Segdata.Vaddr+Segdata.Filelen && s.Type != obj.SDATA && Linkmode == LinkExternal { value = int64(uint64(s.Value) - Segdata.Vaddr - Segdata.Filelen) sect = bsssect - } else if uint64(s.Value) >= Segdata.Vaddr { + } else if uint64(s.Value) >= Segdata.Vaddr && s.Type != obj.STEXT { value = int64(uint64(s.Value) - Segdata.Vaddr) sect = datasect } else if uint64(s.Value) >= Segtext.Vaddr { -- 2.50.0