mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[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 <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
4a43a50791
commit
63815923fc
2 changed files with 16 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue