aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/loader/loader.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-04-10 19:13:01 -0400
committerCherry Zhang <cherryyz@google.com>2020-04-13 17:48:39 +0000
commit14cf804aa047cfdb7be90098d53030773fc1424d (patch)
treed8b34113e60bff0f3b4ef3e725f6a957b28896f9 /src/cmd/link/internal/loader/loader.go
parent2820bcede0ec2f1ec1957e40dab183a18196559b (diff)
downloadgo-14cf804aa047cfdb7be90098d53030773fc1424d.tar.gz
go-14cf804aa047cfdb7be90098d53030773fc1424d.zip
[dev.link] cmd/link: stop populating lib/unit.Textp
lib.Textp was used for text address assignment and trampoline insertion. Now that it has been converted to using the loader, no need to populate lib.Textp. Port the logic of canonicalizing dupok symbol's package to the loader. unit.Textp was used for DWARF generation, which has also been converted to using the loader. Change-Id: I22d4dd30a52a29dd5b1b7b795d43a19f6215e4ac Reviewed-on: https://go-review.googlesource.com/c/go/+/228140 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/link/internal/loader/loader.go')
-rw-r--r--src/cmd/link/internal/loader/loader.go42
1 files changed, 14 insertions, 28 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go
index daf91dd258..ff5d8ed322 100644
--- a/src/cmd/link/internal/loader/loader.go
+++ b/src/cmd/link/internal/loader/loader.go
@@ -1252,10 +1252,10 @@ func (l *Loader) SymUnit(i Sym) *sym.CompilationUnit {
// 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
@@ -1275,9 +1275,6 @@ func (l *Loader) SetSymPkg(i Sym, pkg string) {
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
}
@@ -2452,7 +2449,6 @@ func (l *Loader) CreateStaticSym(name string) Sym {
}
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]
@@ -2463,34 +2459,16 @@ func loadObjFull(l *Loader, r *oReader) {
// 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()
@@ -2711,7 +2689,7 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts
}
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) {
@@ -2722,6 +2700,14 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts
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)
+ }
}
}
}