mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: improved host archive debug trace output
When ctxt.Debugvlog > 1, produce additional trace output to describe which object files are being pulled out of host archive libraries and why they were pulled (e.g. which symbol had a reference to something in a library). Intended to make it easier to debug problems with cgo internal linking. Change-Id: Icd64aff244b9145162a00cb51642ef32f26adfba Reviewed-on: https://go-review.googlesource.com/c/go/+/451736 Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Than McIntosh <thanm@google.com> Reviewed-by: David Chase <drchase@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
58a2db181b
commit
8205d83fe2
3 changed files with 32 additions and 15 deletions
|
|
@ -110,12 +110,15 @@ func hostArchive(ctxt *Link, name string) {
|
||||||
for any {
|
for any {
|
||||||
var load []uint64
|
var load []uint64
|
||||||
returnAllUndefs := -1
|
returnAllUndefs := -1
|
||||||
undefs := ctxt.loader.UndefinedRelocTargets(returnAllUndefs)
|
undefs, froms := ctxt.loader.UndefinedRelocTargets(returnAllUndefs)
|
||||||
for _, symIdx := range undefs {
|
for k, symIdx := range undefs {
|
||||||
name := ctxt.loader.SymName(symIdx)
|
sname := ctxt.loader.SymName(symIdx)
|
||||||
if off := armap[name]; off != 0 && !loaded[off] {
|
if off := armap[sname]; off != 0 && !loaded[off] {
|
||||||
load = append(load, off)
|
load = append(load, off)
|
||||||
loaded[off] = true
|
loaded[off] = true
|
||||||
|
if ctxt.Debugvlog > 1 {
|
||||||
|
ctxt.Logf("hostArchive(%s): selecting object at offset %x to resolve %s [%d] reference from %s [%d]\n", name, off, sname, symIdx, ctxt.loader.SymName(froms[k]), froms[k])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -615,9 +615,14 @@ func (ctxt *Link) loadlib() {
|
||||||
// If we have any undefined symbols in external
|
// If we have any undefined symbols in external
|
||||||
// objects, try to read them from the libgcc file.
|
// objects, try to read them from the libgcc file.
|
||||||
any := false
|
any := false
|
||||||
undefs := ctxt.loader.UndefinedRelocTargets(1)
|
undefs, froms := ctxt.loader.UndefinedRelocTargets(1)
|
||||||
if len(undefs) > 0 {
|
if len(undefs) > 0 {
|
||||||
any = true
|
any = true
|
||||||
|
if ctxt.Debugvlog > 1 {
|
||||||
|
ctxt.Logf("loadlib: first unresolved is %s [%d] from %s [%d]\n",
|
||||||
|
ctxt.loader.SymName(undefs[0]), undefs[0],
|
||||||
|
ctxt.loader.SymName(froms[0]), froms[0])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if any {
|
if any {
|
||||||
if *flagLibGCC == "" {
|
if *flagLibGCC == "" {
|
||||||
|
|
@ -681,9 +686,14 @@ func loadWindowsHostArchives(ctxt *Link) {
|
||||||
hostArchive(ctxt, p)
|
hostArchive(ctxt, p)
|
||||||
}
|
}
|
||||||
any = false
|
any = false
|
||||||
undefs := ctxt.loader.UndefinedRelocTargets(1)
|
undefs, froms := ctxt.loader.UndefinedRelocTargets(1)
|
||||||
if len(undefs) > 0 {
|
if len(undefs) > 0 {
|
||||||
any = true
|
any = true
|
||||||
|
if ctxt.Debugvlog > 1 {
|
||||||
|
ctxt.Logf("loadWindowsHostArchives: remaining unresolved is %s [%d] from %s [%d]\n",
|
||||||
|
ctxt.loader.SymName(undefs[0]), undefs[0],
|
||||||
|
ctxt.loader.SymName(froms[0]), froms[0])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If needed, create the __CTOR_LIST__ and __DTOR_LIST__
|
// If needed, create the __CTOR_LIST__ and __DTOR_LIST__
|
||||||
|
|
@ -2141,7 +2151,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string,
|
||||||
// to true if there is an unresolved reference to the symbol in want[K].
|
// to true if there is an unresolved reference to the symbol in want[K].
|
||||||
func symbolsAreUnresolved(ctxt *Link, want []string) []bool {
|
func symbolsAreUnresolved(ctxt *Link, want []string) []bool {
|
||||||
returnAllUndefs := -1
|
returnAllUndefs := -1
|
||||||
undefs := ctxt.loader.UndefinedRelocTargets(returnAllUndefs)
|
undefs, _ := ctxt.loader.UndefinedRelocTargets(returnAllUndefs)
|
||||||
seen := make(map[loader.Sym]struct{})
|
seen := make(map[loader.Sym]struct{})
|
||||||
rval := make([]bool, len(want))
|
rval := make([]bool, len(want))
|
||||||
wantm := make(map[string]int)
|
wantm := make(map[string]int)
|
||||||
|
|
|
||||||
|
|
@ -2392,12 +2392,15 @@ func (l *Loader) RelocVariant(s Sym, ri int) sym.RelocVariant {
|
||||||
// space, looking for symbols with relocations targeting undefined
|
// space, looking for symbols with relocations targeting undefined
|
||||||
// references. The linker's loadlib method uses this to determine if
|
// references. The linker's loadlib method uses this to determine if
|
||||||
// there are unresolved references to functions in system libraries
|
// there are unresolved references to functions in system libraries
|
||||||
// (for example, libgcc.a), presumably due to CGO code. Return
|
// (for example, libgcc.a), presumably due to CGO code. Return value
|
||||||
// value is a list of loader.Sym's corresponding to the undefined
|
// is a pair of lists of loader.Sym's. First list corresponds to the
|
||||||
// cross-refs. The "limit" param controls the maximum number of
|
// corresponding to the undefined symbols themselves, the second list
|
||||||
// results returned; if "limit" is -1, then all undefs are returned.
|
// is the symbol that is making a reference to the undef. The "limit"
|
||||||
func (l *Loader) UndefinedRelocTargets(limit int) []Sym {
|
// param controls the maximum number of results returned; if "limit"
|
||||||
result := []Sym{}
|
// is -1, then all undefs are returned.
|
||||||
|
func (l *Loader) UndefinedRelocTargets(limit int) ([]Sym, []Sym) {
|
||||||
|
result, fromr := []Sym{}, []Sym{}
|
||||||
|
outerloop:
|
||||||
for si := Sym(1); si < Sym(len(l.objSyms)); si++ {
|
for si := Sym(1); si < Sym(len(l.objSyms)); si++ {
|
||||||
relocs := l.Relocs(si)
|
relocs := l.Relocs(si)
|
||||||
for ri := 0; ri < relocs.Count(); ri++ {
|
for ri := 0; ri < relocs.Count(); ri++ {
|
||||||
|
|
@ -2405,13 +2408,14 @@ func (l *Loader) UndefinedRelocTargets(limit int) []Sym {
|
||||||
rs := r.Sym()
|
rs := r.Sym()
|
||||||
if rs != 0 && l.SymType(rs) == sym.SXREF && l.SymName(rs) != ".got" {
|
if rs != 0 && l.SymType(rs) == sym.SXREF && l.SymName(rs) != ".got" {
|
||||||
result = append(result, rs)
|
result = append(result, rs)
|
||||||
|
fromr = append(fromr, si)
|
||||||
if limit != -1 && len(result) >= limit {
|
if limit != -1 && len(result) >= limit {
|
||||||
break
|
break outerloop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result, fromr
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssignTextSymbolOrder populates the Textp slices within each
|
// AssignTextSymbolOrder populates the Textp slices within each
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue