From: Than McIntosh Date: Wed, 8 Jul 2020 14:43:42 +0000 (-0400) Subject: [dev.link] cmd/link: fix ppc64-specific bug in genelfsym X-Git-Tag: go1.16beta1~1378^2~11 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=18ee3498805f81ef7f3435800bc5581599c61872;p=gostls13.git [dev.link] cmd/link: fix ppc64-specific bug in genelfsym The code in the the linker's genelfsym() routine was not properly including runtime.text.%d marker symbols that are emitted on PPC64 when a very large text section is split into chunks. This bug was introduced in CL 233338 when portions of asmb2() were converted from sym.Symbol to loader.Sym usage. Change-Id: Idfed944c41e1805f78f35be67bcdd18bdefd7819 Reviewed-on: https://go-review.googlesource.com/c/go/+/241498 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 97d7a22537..bc880955b8 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -180,12 +180,31 @@ func putelfsectionsym(ctxt *Link, out *OutBuf, s loader.Sym, shndx int) { func genelfsym(ctxt *Link, elfbind int) { ldr := ctxt.loader - // Text symbols. + // runtime.text marker symbol(s). s := ldr.Lookup("runtime.text", 0) putelfsym(ctxt, s, STT_FUNC, elfbind) + for k, sect := range Segtext.Sections[1:] { + n := k + 1 + if sect.Name != ".text" || (ctxt.IsAIX() && ctxt.IsExternal()) { + // On AIX, runtime.text.X are symbols already in the symtab. + break + } + s = ldr.Lookup(fmt.Sprintf("runtime.text.%d", n), 0) + if s == 0 { + break + } + if ldr.SymType(s) != sym.STEXT { + panic("unexpected type for runtime.text symbol") + } + putelfsym(ctxt, s, STT_FUNC, elfbind) + } + + // Text symbols. for _, s := range ctxt.Textp { putelfsym(ctxt, s, STT_FUNC, elfbind) } + + // runtime.etext marker symbol. s = ldr.Lookup("runtime.etext", 0) if ldr.SymType(s) == sym.STEXT { putelfsym(ctxt, s, STT_FUNC, elfbind)