From f58c48f83419941251b96389cd6ca1705e712e11 Mon Sep 17 00:00:00 2001 From: Hiroshi Ioka Date: Sat, 9 Sep 2017 11:23:29 +0900 Subject: [PATCH] cmd/link: extract windows-specific code from dynrelocsym No functional changes. Change-Id: Ib31bb3f01b515aac6428ec61e0ef02b269623890 Reviewed-on: https://go-review.googlesource.com/62470 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/data.go | 77 +++++++++++++++++--------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 8f97d3e335..4b1d541368 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -759,49 +759,52 @@ func (ctxt *Link) reloc() { } } -func dynrelocsym(ctxt *Link, s *Symbol) { - if Headtype == objabi.Hwindows && Linkmode != LinkExternal { - rel := ctxt.Syms.Lookup(".rel", 0) - if s == rel { - return +func windynrelocsym(ctxt *Link, s *Symbol) { + rel := ctxt.Syms.Lookup(".rel", 0) + if s == rel { + return + } + for ri := 0; ri < len(s.R); ri++ { + r := &s.R[ri] + targ := r.Sym + if targ == nil { + continue } - for ri := 0; ri < len(s.R); ri++ { - r := &s.R[ri] - targ := r.Sym - if targ == nil { + if !targ.Attr.Reachable() { + if r.Type == objabi.R_WEAKADDROFF { continue } - if !targ.Attr.Reachable() { - if r.Type == objabi.R_WEAKADDROFF { - continue - } - Errorf(s, "dynamic relocation to unreachable symbol %s", targ.Name) - } - if r.Sym.Plt == -2 && r.Sym.Got != -2 { // make dynimport JMP table for PE object files. - targ.Plt = int32(rel.Size) - r.Sym = rel - r.Add = int64(targ.Plt) - - // jmp *addr - if SysArch.Family == sys.I386 { - Adduint8(ctxt, rel, 0xff) - Adduint8(ctxt, rel, 0x25) - Addaddr(ctxt, rel, targ) - Adduint8(ctxt, rel, 0x90) - Adduint8(ctxt, rel, 0x90) - } else { - Adduint8(ctxt, rel, 0xff) - Adduint8(ctxt, rel, 0x24) - Adduint8(ctxt, rel, 0x25) - addaddrplus4(ctxt, rel, targ, 0) - Adduint8(ctxt, rel, 0x90) - } - } else if r.Sym.Plt >= 0 { - r.Sym = rel - r.Add = int64(targ.Plt) + Errorf(s, "dynamic relocation to unreachable symbol %s", targ.Name) + } + if r.Sym.Plt == -2 && r.Sym.Got != -2 { // make dynimport JMP table for PE object files. + targ.Plt = int32(rel.Size) + r.Sym = rel + r.Add = int64(targ.Plt) + + // jmp *addr + if SysArch.Family == sys.I386 { + Adduint8(ctxt, rel, 0xff) + Adduint8(ctxt, rel, 0x25) + Addaddr(ctxt, rel, targ) + Adduint8(ctxt, rel, 0x90) + Adduint8(ctxt, rel, 0x90) + } else { + Adduint8(ctxt, rel, 0xff) + Adduint8(ctxt, rel, 0x24) + Adduint8(ctxt, rel, 0x25) + addaddrplus4(ctxt, rel, targ, 0) + Adduint8(ctxt, rel, 0x90) } + } else if r.Sym.Plt >= 0 { + r.Sym = rel + r.Add = int64(targ.Plt) } + } +} +func dynrelocsym(ctxt *Link, s *Symbol) { + if Headtype == objabi.Hwindows && Linkmode != LinkExternal { + windynrelocsym(ctxt, s) return } -- 2.48.1