From e73981512fdc5e1128a9b17c4b9788c600db23ea Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Thu, 5 Mar 2015 14:21:42 +1300 Subject: [PATCH] cmd/internal/obj/x86: implement -shared computation of TLS base Somehow, terribly embarrassingly, I lost part of the "re-enable -shared on amd64" patch when rebasing before it got submitted. This restores it and also fixes the addend to be the necessary -4. Change-Id: If71a09121d911a863bc07f1828ef76e3a54c1074 Reviewed-on: https://go-review.googlesource.com/6802 Reviewed-by: Russ Cox Run-TryBot: Minux Ma TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/x86/asm6.go | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index ae47801249..096c37a29f 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -3765,6 +3765,39 @@ func doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Andptr = ctxt.Andptr[1:] asmand(ctxt, p, &pp.From, &p.To) + case obj.Hlinux: + if ctxt.Flag_shared == 0 { + log.Fatalf("unknown TLS base location for linux without -shared") + } + // Note that this is not generating the same insn as the other cases. + // MOV TLS, R_to + // becomes + // movq g@gottpoff(%rip), R_to + // which is encoded as + // movq 0(%rip), R_to + // and a R_TLS_IE reloc. This all assumes the only tls variable we access + // is g, which we can't check here, but will when we assemble the second + // instruction. + ctxt.Rexflag = Pw | (regrex[p.To.Reg] & Rxr) + + ctxt.Andptr[0] = 0x8B + ctxt.Andptr = ctxt.Andptr[1:] + ctxt.Andptr[0] = byte(0x05 | (reg[p.To.Reg] << 3)) + ctxt.Andptr = ctxt.Andptr[1:] + r = obj.Addrel(ctxt.Cursym) + r.Off = int32(p.Pc + int64(-cap(ctxt.Andptr)+cap(ctxt.And[:]))) + r.Type = obj.R_TLS_IE + r.Siz = 4 + r.Add = -4 + ctxt.Andptr[0] = 0x00 + ctxt.Andptr = ctxt.Andptr[1:] + ctxt.Andptr[0] = 0x00 + ctxt.Andptr = ctxt.Andptr[1:] + ctxt.Andptr[0] = 0x00 + ctxt.Andptr = ctxt.Andptr[1:] + ctxt.Andptr[0] = 0x00 + ctxt.Andptr = ctxt.Andptr[1:] + case obj.Hplan9: if ctxt.Plan9privates == nil { ctxt.Plan9privates = obj.Linklookup(ctxt, "_privates", 0) -- 2.48.1