From: Than McIntosh Date: Tue, 24 Mar 2020 13:20:01 +0000 (-0400) Subject: [dev.link] cmd/link: convert windynrelocsyms to loader APIs X-Git-Tag: go1.15beta1~679^2~24 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7716d7fc1b025049b6377f5e7ce184d8e6671678;p=gostls13.git [dev.link] cmd/link: convert windynrelocsyms to loader APIs Convert the linker's windynrelocsyms method to work with loader APIs. Change-Id: I8c1fb153bfae8b5c6893876abc9534c34267a42c Reviewed-on: https://go-review.googlesource.com/c/go/+/225200 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index c2ccb2790b..4174a706cd 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -600,45 +600,65 @@ func (ctxt *Link) reloc() { wg.Wait() } -func windynrelocsym(ctxt *Link, rel, s *sym.Symbol) { - for ri := range s.R { - r := &s.R[ri] - targ := r.Sym - if targ == nil { +func windynrelocsym(ctxt *Link, rel *loader.SymbolBuilder, s loader.Sym) { + var su *loader.SymbolBuilder + var rslice []loader.Reloc + relocs := ctxt.loader.Relocs(s) + for ri := 0; ri < relocs.Count; ri++ { + r := relocs.At2(ri) + targ := r.Sym() + if targ == 0 { continue } - if !targ.Attr.Reachable() { - if r.Type == objabi.R_WEAKADDROFF { + rt := r.Type() + if !ctxt.loader.AttrReachable(targ) { + if rt == objabi.R_WEAKADDROFF { continue } - Errorf(s, "dynamic relocation to unreachable symbol %s", targ.Name) + ctxt.Errorf(s, "dynamic relocation to unreachable symbol %s", + ctxt.loader.SymName(targ)) } - if r.Sym.Plt() == -2 && r.Sym.Got() != -2 { // make dynimport JMP table for PE object files. - targ.SetPlt(int32(rel.Size)) - r.Sym = rel - r.Add = int64(targ.Plt()) + + tplt := ctxt.loader.SymPlt(targ) + tgot := ctxt.loader.SymGot(targ) + if tplt == -2 && tgot != -2 { // make dynimport JMP table for PE object files. + tplt := int32(rel.Size()) + ctxt.loader.SetPlt(targ, tplt) + + if su == nil { + su = ctxt.loader.MakeSymbolUpdater(s) + rslice = su.Relocs() + } + r := &rslice[ri] + r.Sym = rel.Sym() + r.Add = int64(tplt) // jmp *addr switch ctxt.Arch.Family { default: - Errorf(s, "unsupported arch %v", ctxt.Arch.Family) + ctxt.Errorf(s, "unsupported arch %v", ctxt.Arch.Family) return case sys.I386: rel.AddUint8(0xff) rel.AddUint8(0x25) - rel.AddAddr(ctxt.Arch, targ) + rel.AddAddrPlus(ctxt.Arch, targ, 0) rel.AddUint8(0x90) rel.AddUint8(0x90) case sys.AMD64: rel.AddUint8(0xff) rel.AddUint8(0x24) rel.AddUint8(0x25) - rel.AddAddrPlus4(targ, 0) + rel.AddAddrPlus4(ctxt.Arch, targ, 0) rel.AddUint8(0x90) } - } else if r.Sym.Plt() >= 0 { - r.Sym = rel - r.Add = int64(targ.Plt()) + } else if tplt >= 0 { + if su == nil { + su = ctxt.loader.MakeSymbolUpdater(s) + rslice = su.Relocs() + } + r := &rslice[ri] + r.Sym = rel.Sym() + r.Add = int64(tplt) } } } @@ -646,22 +666,19 @@ func windynrelocsym(ctxt *Link, rel, s *sym.Symbol) { // windynrelocsyms generates jump table to C library functions that will be // added later. windynrelocsyms writes the table into .rel symbol. func (ctxt *Link) windynrelocsyms() { - if !(ctxt.HeadType == objabi.Hwindows && iscgo && ctxt.LinkMode == LinkInternal) { + if !(ctxt.IsWindows() && iscgo && ctxt.IsInternal()) { return } - /* relocation table */ - rel := ctxt.Syms.Lookup(".rel", 0) - rel.Attr |= sym.AttrReachable - rel.Type = sym.STEXT - ctxt.Textp = append(ctxt.Textp, rel) + rel := ctxt.loader.LookupOrCreateSym(".rel", 0) + relu := ctxt.loader.MakeSymbolUpdater(rel) + relu.SetType(sym.STEXT) - for _, s := range ctxt.Textp { - if s == rel { - continue - } - windynrelocsym(ctxt, rel, s) + for _, s := range ctxt.Textp2 { + windynrelocsym(ctxt, relu, s) } + + ctxt.Textp2 = append(ctxt.Textp2, rel) } func dynrelocsym(ctxt *Link, s *sym.Symbol) { diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 82862d274e..3a7d3b2a11 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -271,6 +271,8 @@ func Main(arch *sys.Arch, theArch Arch) { if ctxt.IsWindows() { bench.Start("dope") ctxt.dope() + bench.Start("windynrelocsyms") + ctxt.windynrelocsyms() } if ctxt.IsAIX() { bench.Start("doxcoff") @@ -283,10 +285,6 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("loadlibfull") setupdynexp(ctxt) ctxt.loadlibfull() // XXX do it here for now - if ctxt.IsWindows() { - bench.Start("windynrelocsyms") - ctxt.windynrelocsyms() - } ctxt.setArchSyms() bench.Start("addexport")