case objabi.R_ADDRCUOFF:
// debug_range and debug_loc elements use this relocation type to get an
// offset from the start of the compile unit.
- o = Symaddr(r.Sym) + r.Add - Symaddr(r.Sym.Unit.Textp[0])
+ o = Symaddr(r.Sym) + r.Add - Symaddr(ldr.Syms[r.Sym.Unit.Textp2[0]])
// r->sym can be null when CALL $(constant) is transformed from absolute PC to relative PC call.
case objabi.R_GOTPCREL:
package ld
import (
- "cmd/internal/objabi"
"cmd/link/internal/sym"
)
}
// addToTextp populates the context Textp slice (needed in various places
-// in the linker) and also the unit Textp slices (needed by the "old"
-// phase 2 DWARF generation).
+// in the linker).
func addToTextp(ctxt *Link) {
-
- // First set up ctxt.Textp, based on ctxt.Textp2.
+ // Set up ctxt.Textp, based on ctxt.Textp2.
textp := make([]*sym.Symbol, 0, len(ctxt.Textp2))
haveshlibs := len(ctxt.Shlibs) > 0
for _, tsym := range ctxt.Textp2 {
textp = append(textp, sp)
}
ctxt.Textp = textp
-
- // Dupok symbols may be defined in multiple packages; the
- // associated package for a dupok sym is chosen sort of
- // arbitrarily (the first containing package that the linker
- // loads). The loop below canonicalizes the File to the package
- // with which it will be laid down in text. Assumes that
- // ctxt.Library is already in postorder.
- for _, doInternal := range [2]bool{true, false} {
- for _, lib := range ctxt.Library {
- if isRuntimeDepPkg(lib.Pkg) != doInternal {
- continue
- }
- for _, dsym := range lib.DupTextSyms2 {
- tsp := ctxt.loader.Syms[dsym]
- if !tsp.Attr.OnList() {
- tsp.Attr |= sym.AttrOnList
- tsp.File = objabi.PathToPrefix(lib.Pkg)
- }
- }
- }
- }
-
- // Finally, set up compilation unit Textp slices. Can be removed
- // once loader-Sym DWARF-gen phase 2 is always enabled.
- for _, lib := range ctxt.Library {
- for _, unit := range lib.Units {
- for _, usym := range unit.Textp2 {
- usp := ctxt.loader.Syms[usym]
- usp.Attr |= sym.AttrOnList
- unit.Textp = append(unit.Textp, usp)
- }
- }
- }
}
// shared library), will hold the library name.
// NOTE: this correspondes to sym.Symbol.File field.
func (l *Loader) SymPkg(i Sym) string {
+ if f, ok := l.symPkg[i]; ok {
+ return f
+ }
if l.IsExternal(i) {
- if f, ok := l.symPkg[i]; ok {
- return f
- }
pp := l.getPayload(i)
if pp.objidx != 0 {
r := l.objs[pp.objidx].r
if i >= Sym(len(l.objSyms)) || i == 0 {
panic("bad symbol index in SetSymPkg")
}
- if !l.IsExternal(i) {
- panic("can't set file for non-external sym")
- }
l.symPkg[i] = pkg
}
}
func loadObjFull(l *Loader, r *oReader) {
- lib := r.unit.Lib
resolveSymRef := func(s goobj2.SymRef) *sym.Symbol {
i := l.resolve(r, s)
return l.Syms[i]
// content will actually be provided by a different object
// (to which its global index points). Skip those symbols.
gi := l.toGlobal(r, i)
- var isdup bool
if r2, i2 := l.toLocal(gi); r2 != r || i2 != i {
- isdup = true
- }
-
- osym := r.Sym(i)
- dupok := osym.Dupok()
- if dupok && isdup {
- if l.attrReachable.Has(gi) {
- // A dupok symbol is resolved to another package. We still need
- // to record its presence in the current package, as the trampoline
- // pass expects packages are laid out in dependency order.
- s := l.Syms[gi]
- if s.Type == sym.STEXT {
- lib.DupTextSyms = append(lib.DupTextSyms, s)
- }
- }
continue
}
-
- if isdup {
- continue // come from a different object
- }
s := l.Syms[gi]
if s == nil {
continue
}
+ osym := r.Sym(i)
+ dupok := osym.Dupok()
local := osym.Local()
makeTypelink := osym.Typelink()
size := osym.Siz()
}
libtextp2 := []sym.LoaderSym{}
lists := [2][]sym.LoaderSym{lib.Textp2, lib.DupTextSyms2}
- for _, list := range lists {
+ for i, list := range lists {
for _, s := range list {
sym := Sym(s)
if l.attrReachable.Has(sym) && !assignedToUnit.Has(sym) {
unit.Textp2 = append(unit.Textp2, s)
assignedToUnit.Set(sym)
}
+ // Dupok symbols may be defined in multiple packages; the
+ // associated package for a dupok sym is chosen sort of
+ // arbitrarily (the first containing package that the linker
+ // loads). Canonicalizes its Pkg to the package with which
+ // it will be laid down in text.
+ if i == 1 /* DupTextSyms2 */ && l.SymPkg(sym) != lib.Pkg {
+ l.SetSymPkg(sym, lib.Pkg)
+ }
}
}
}
Hash string
ImportStrings []string
Imports []*Library
- Textp []*Symbol // text symbols defined in this library
- DupTextSyms []*Symbol // dupok text symbols defined in this library
Main bool
Safe bool
Units []*CompilationUnit