From: Cherry Zhang Date: Fri, 1 Nov 2019 01:53:49 +0000 (-0400) Subject: [dev.link] cmd/link: resolve ABI aliases for external symbols X-Git-Tag: go1.14beta1~292^2^2~16 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=63815923fc7ef8dd9b6ae04b791e2811d74f9c1b;p=gostls13.git [dev.link] cmd/link: resolve ABI aliases for external symbols ABI alias references in Go symbols are resolved during loadObjFull. But for external symbols they are not resolved. If there is a reference from an external symbol to a Go ABIInternal symbol, this reference will be invalid as it is not resolved. The old code resolve ABI aliases in the deadcode pass. But the new deadcode pass doesn't do it, as it works with indices instead of Symbols. We do this in LoadFull. This makes all internal cgo linking tests pass on Mach-O. Change-Id: Iac6c084c03f5ddbcc9455527800ce7ed7313f9a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/204698 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index b882df29a1..e46457d858 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2620,7 +2620,7 @@ func (ctxt *Link) loadlibfull() { func (ctxt *Link) dumpsyms() { for _, s := range ctxt.Syms.Allsym { - fmt.Printf("%s %s %p\n", s, s.Type, s) + fmt.Printf("%s %s %p %v %v\n", s, s.Type, s, s.Attr.Reachable(), s.Attr.OnList()) for i := range s.R { fmt.Println("\t", s.R[i].Type, s.R[i].Sym) } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 0ce6f54ef7..67c4c9719c 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -753,6 +753,21 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols) { for _, o := range l.objs[1:] { loadObjFull(l, o.r) } + + // Resolve ABI aliases for external symbols. This is only + // needed for internal cgo linking. + // (The old code does this in deadcode, but deadcode2 doesn't + // do this.) + for i := l.extStart; i <= l.max; i++ { + if s := l.Syms[i]; s != nil && s.Attr.Reachable() { + for ri := range s.R { + r := &s.R[ri] + if r.Sym != nil && r.Sym.Type == sym.SABIALIAS { + r.Sym = r.Sym.R[0].Sym + } + } + } + } } // ExtractSymbols grabs the symbols out of the loader for work that hasn't been