mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.link] cmd/link: set cgo attributes early when internal cgo linking
In newobj mode, cgo attributes are typically set later, as we create sym.Symbols later. But when internal cgo linking, the host object loaders still work with sym.Symbols, and the cgo attributes need to be set for them to work properly. Therefore, set them early. This will cause creating some Symbols eagerly, but they are mostly host object symbols and will need to be created anyway. Now all cgo internal linking tests pass on ELF systems. Change-Id: I023a4df4429acc8ebf5e185f62e6809198497a78 Reviewed-on: https://go-review.googlesource.com/c/go/+/204857 Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
dfd8de1004
commit
48a0b97902
6 changed files with 47 additions and 46 deletions
|
|
@ -814,6 +814,7 @@ func (l *Loader) addNewSym(i Sym, syms *sym.Symbols, name string, ver int, unit
|
|||
}
|
||||
s.Type = t
|
||||
s.Unit = unit
|
||||
l.growSyms(int(i))
|
||||
l.Syms[i] = s
|
||||
return s
|
||||
}
|
||||
|
|
@ -891,7 +892,7 @@ func (l *Loader) LoadSymbol(name string, version int, syms *sym.Symbols) *sym.Sy
|
|||
global := l.Lookup(name, version)
|
||||
|
||||
// If we're already loaded, bail.
|
||||
if global != 0 && l.Syms[global] != nil {
|
||||
if global != 0 && int(global) < len(l.Syms) && l.Syms[global] != nil {
|
||||
return l.Syms[global]
|
||||
}
|
||||
|
||||
|
|
@ -908,6 +909,28 @@ func (l *Loader) LoadSymbol(name string, version int, syms *sym.Symbols) *sym.Sy
|
|||
return l.addNewSym(istart+Sym(i), syms, name, version, r.unit, sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type)])
|
||||
}
|
||||
|
||||
// LookupOrCreate looks up a symbol by name, and creates one if not found.
|
||||
// Either way, it will also create a sym.Symbol for it, if not already.
|
||||
// This should only be called when interacting with parts of the linker
|
||||
// that still works on sym.Symbols (i.e. internal cgo linking, for now).
|
||||
func (l *Loader) LookupOrCreate(name string, version int, syms *sym.Symbols) *sym.Symbol {
|
||||
i := l.Lookup(name, version)
|
||||
if i != 0 {
|
||||
// symbol exists
|
||||
if int(i) < len(l.Syms) && l.Syms[i] != nil {
|
||||
return l.Syms[i] // already loaded
|
||||
}
|
||||
if l.IsExternal(i) {
|
||||
panic("Can't load an external symbol.")
|
||||
}
|
||||
return l.LoadSymbol(name, version, syms)
|
||||
}
|
||||
i = l.AddExtSym(name, version)
|
||||
s := syms.Newsym(name, version)
|
||||
l.Syms[i] = s
|
||||
return s
|
||||
}
|
||||
|
||||
func loadObjFull(l *Loader, r *oReader) {
|
||||
lib := r.unit.Lib
|
||||
istart := l.startIndex(r)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue