From: Keith Randall Date: Sat, 27 Jun 2015 19:57:06 +0000 (-0700) Subject: cmd/link/internal/ld: exclude only real container symbols from symtab X-Git-Tag: go1.5beta1~71 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=214c7a2c43a43fd05e3b94dbc67e7d0082460986;p=gostls13.git cmd/link/internal/ld: exclude only real container symbols from symtab It looks like the test for whether symbols contain subsymbols is wrong. In particular, symbols in C libraries are mistakenly considered container symbols. Fix the test so only symbols which actually have a subsymbol are excluded from the symtab. When linking cgo programs the list of containers is small, something like: container _/home/khr/sandbox/symtab/misc/cgo/test(.text)<74> container _/home/khr/sandbox/symtab/misc/cgo/test/issue8828(.text)<75> container _/home/khr/sandbox/symtab/misc/cgo/test/issue9026(.text)<76> container runtime/cgo(.text)<77> I'm not sure this is the right fix. In particular I can't reproduce the original problem. Anyone have a repro they can try and see if this fix works? Fixes #10747 Fixes #11396 Change-Id: Id8b016389d33348b4a791fdcba0f9db8ae71ebf3 Reviewed-on: https://go-review.googlesource.com/11652 Reviewed-by: Russ Cox --- diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index a6ade0f20d..24de6ef698 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -365,9 +365,10 @@ const ( SCONST SDYNIMPORT SHOSTOBJ - SSUB = 1 << 8 - SMASK = SSUB - 1 - SHIDDEN = 1 << 9 + SSUB = 1 << 8 + SMASK = SSUB - 1 + SHIDDEN = 1 << 9 + SCONTAINER = 1 << 10 // has a sub-symbol ) type Reloc struct { diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index be2568d3b9..56d813bfde 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -191,7 +191,7 @@ func renumberfiles(ctxt *Link, files []*LSym, d *Pcdata) { func container(s *LSym) int { // We want to generate func table entries only for the "lowest level" symbols, // not containers of subsymbols. - if s != nil && s.Sub != nil { + if s != nil && s.Type&obj.SCONTAINER != 0 { return 1 } return 0 @@ -223,6 +223,13 @@ func pclntab() { // offset to file table [4 bytes] nfunc := int32(0) + // Find container symbols, mark them with SCONTAINER + for Ctxt.Cursym = Ctxt.Textp; Ctxt.Cursym != nil; Ctxt.Cursym = Ctxt.Cursym.Next { + if Ctxt.Cursym.Outer != nil { + Ctxt.Cursym.Outer.Type |= obj.SCONTAINER + } + } + for Ctxt.Cursym = Ctxt.Textp; Ctxt.Cursym != nil; Ctxt.Cursym = Ctxt.Cursym.Next { if container(Ctxt.Cursym) == 0 { nfunc++