]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: extract windows-specific code from dynrelocsym
authorHiroshi Ioka <hirochachacha@gmail.com>
Sat, 9 Sep 2017 02:23:29 +0000 (11:23 +0900)
committerIan Lance Taylor <iant@golang.org>
Sat, 9 Sep 2017 07:06:23 +0000 (07:06 +0000)
No functional changes.

Change-Id: Ib31bb3f01b515aac6428ec61e0ef02b269623890
Reviewed-on: https://go-review.googlesource.com/62470
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/link/internal/ld/data.go

index 8f97d3e335f1712cc9fa33b90b498c4178ff8612..4b1d5413686ed4c2811e61d53c19a78b7b948aeb 100644 (file)
@@ -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
        }