From: Cherry Zhang Date: Mon, 13 Mar 2017 12:24:46 +0000 (-0400) Subject: cmd/link: on PPC64, put plt stubs at beginning of Textp X-Git-Tag: go1.9beta1~1159 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=15b37655bc0b786d3cd6e41553263963fbebd642;p=gostls13.git cmd/link: on PPC64, put plt stubs at beginning of Textp Put call stubs at the beginning (instead of the end). So the trampoline pass knows the addresses of the stubs, and it can insert trampolines when necessary. Fixes #19425. Change-Id: I1e06529ef837a6130df58917315610d45a6819ca Reviewed-on: https://go-review.googlesource.com/38131 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Lynn Boger --- diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 97107b9e52..cf2c532f9e 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -87,6 +87,7 @@ func genplt(ctxt *ld.Link) { // // This assumes "case 1" from the ABI, where the caller needs // us to save and restore the TOC pointer. + var stubs []*ld.Symbol for _, s := range ctxt.Textp { for i := range s.R { r := &s.R[i] @@ -108,7 +109,7 @@ func genplt(ctxt *ld.Link) { if stub.Size == 0 { // Need outer to resolve .TOC. stub.Outer = s - ctxt.Textp = append(ctxt.Textp, stub) + stubs = append(stubs, stub) gencallstub(ctxt, 1, stub, r.Sym) } @@ -121,6 +122,11 @@ func genplt(ctxt *ld.Link) { ctxt.Arch.ByteOrder.PutUint32(s.P[r.Off+4:], o1) } } + // Put call stubs at the beginning (instead of the end). + // So when resolving the relocations to calls to the stubs, + // the addresses are known and trampolines can be inserted + // when necessary. + ctxt.Textp = append(stubs, ctxt.Textp...) } func genaddmoduledata(ctxt *ld.Link) {