]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/x86: still use (fake) local exec TLS mode on android/386
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Thu, 19 Nov 2015 09:14:13 +0000 (22:14 +1300)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Thu, 19 Nov 2015 17:43:37 +0000 (17:43 +0000)
golang.org/cl/16383 broke android/386 because by a sort of confluence of hacks
no TLS relocations were emitted at all when Flag_shared != 0. The hack in
runtime/cgo works as well in a PIE executable as it does with a position
dependent one, so the simplest fix is to still emit a R_TLS_LE reloc when goos
== "android".

A real fix is to use something more like the IE model code but loading the
offset from %gs to the thread local storage from a global variable rather than
from a location chosen by the system linker (this is how android/arm works).

Issue #9327.

Change-Id: I9fbfc890ec7fe191f80a595b6cf8e2a1fcbe3034
Reviewed-on: https://go-review.googlesource.com/17049
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
src/cmd/internal/obj/x86/asm6.go

index 04ef3b343f14fb4cd2d85dec47a4acf4fc8c1c3a..ed728aa727c6e203bd283e4c4819d1ece81a0be4 100644 (file)
@@ -2536,7 +2536,7 @@ func vaddr(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, r *obj.Reloc) int64 {
                        log.Fatalf("reloc")
                }
 
-               if ctxt.Flag_shared == 0 {
+               if ctxt.Flag_shared == 0 || isAndroid {
                        r.Type = obj.R_TLS_LE
                        r.Siz = 4
                        r.Off = -1 // caller must fill in