mirror of
https://github.com/golang/go
synced 2024-11-11 22:50:22 -07:00
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 <rsc@golang.org>
This commit is contained in:
parent
0a6df4a87b
commit
214c7a2c43
@ -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 {
|
||||
|
@ -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++
|
||||
|
Loading…
Reference in New Issue
Block a user