]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: fix accidental escape in extreloc
authorCherry Zhang <cherryyz@google.com>
Tue, 28 Jul 2020 17:33:47 +0000 (13:33 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 28 Jul 2020 19:47:05 +0000 (19:47 +0000)
We accidentally passed the address of a local to a function
pointer, where we should pass the address of a global.

Linking cmd/compile with external linking:

Asmb2_GC       32.5ms ± 5%    21.6ms ± 3%  -33.57%  (p=0.016 n=5+4)
Asmb2_GC       29.2MB ± 0%     6.4MB ± 0%  -78.20%  (p=0.008 n=5+5)
Asmb2_GC        1.43M ± 0%     0.00M ± 4%  -99.98%  (p=0.008 n=5+5)

Change-Id: I4754189bcc20f824627d95858ba35285d53c614d
Reviewed-on: https://go-review.googlesource.com/c/go/+/245337
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/ld/data.go

index f06aa422d93689d807fe50f632297a171c6b8787..2a3d6e7fe744c8d6b2154860bb932f7b1ad06039 100644 (file)
@@ -540,7 +540,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
 // Convert a Go relocation to an external relocation.
 func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri int) (loader.ExtReloc, bool) {
        var rr loader.ExtReloc
-       target := ctxt.Target
+       target := &ctxt.Target
        siz := int32(r.Siz())
        if siz == 0 { // informational relocation - no work to do
                return rr, false
@@ -563,7 +563,7 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri
 
        switch rt {
        default:
-               return thearch.Extreloc(&target, ldr, r, s)
+               return thearch.Extreloc(target, ldr, r, s)
 
        case objabi.R_TLS_LE, objabi.R_TLS_IE:
                if target.IsElf() {