mirror of
https://github.com/golang/go
synced 2024-11-19 09:04:41 -07:00
cmd/internal/ld, runtime: halve tlsoffset on ELF/intel
For OSes that use elf on intel, 2*Ptrsize bytes are reserved for TLS. But only one pointer (g) has been stored in the TLS for a while now. So we can set it to just Ptrsize, which happily matches what happens when externally linking. Fixes #9913 Change-Id: Ic816369d3a55a8cdcc23be349b1a1791d53f5f81 Reviewed-on: https://go-review.googlesource.com/6584 Run-TryBot: Minux Ma <minux@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
5e49bfec92
commit
658a338f78
@ -107,7 +107,7 @@ func linknew(arch *LinkArch) *Link {
|
||||
Hopenbsd,
|
||||
Hdragonfly,
|
||||
Hsolaris:
|
||||
ctxt.Tlsoffset = -2 * ctxt.Arch.Ptrsize
|
||||
ctxt.Tlsoffset = -1 * ctxt.Arch.Ptrsize
|
||||
|
||||
case Hnacl:
|
||||
switch ctxt.Arch.Thechar {
|
||||
|
@ -170,7 +170,7 @@ func Linknew(arch *LinkArch) *Link {
|
||||
Hopenbsd,
|
||||
Hdragonfly,
|
||||
Hsolaris:
|
||||
ctxt.Tlsoffset = -2 * ctxt.Arch.Ptrsize
|
||||
ctxt.Tlsoffset = -1 * ctxt.Arch.Ptrsize
|
||||
|
||||
case Hnacl:
|
||||
switch ctxt.Arch.Thechar {
|
||||
|
@ -295,9 +295,9 @@ TEXT runtime·setldt(SB),NOSPLIT,$4
|
||||
RET
|
||||
|
||||
TEXT runtime·settls(SB),NOSPLIT,$24
|
||||
// adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
|
||||
// adjust for ELF: wants to use -4(GS) for g
|
||||
MOVL tlsbase+0(FP), CX
|
||||
ADDL $8, CX
|
||||
ADDL $4, CX
|
||||
|
||||
// Set up a struct tls_info - a size of -1 maps the whole address
|
||||
// space and is required for direct-tls access of variable data
|
||||
|
@ -272,7 +272,7 @@ TEXT runtime·usleep(SB),NOSPLIT,$16
|
||||
|
||||
// set tls base to DI
|
||||
TEXT runtime·settls(SB),NOSPLIT,$16
|
||||
ADDQ $16, DI // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
|
||||
ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g
|
||||
MOVQ DI, 0(SP)
|
||||
MOVQ $16, 8(SP)
|
||||
MOVQ $0, DI // arg 1 - which
|
||||
|
@ -287,7 +287,7 @@ int i386_set_ldt(int, const union ldt_entry *, int);
|
||||
TEXT runtime·setldt(SB),NOSPLIT,$32
|
||||
MOVL address+4(FP), BX // aka base
|
||||
// see comment in sys_linux_386.s; freebsd is similar
|
||||
ADDL $0x8, BX
|
||||
ADDL $0x4, BX
|
||||
|
||||
// set up data_desc
|
||||
LEAL 16(SP), AX // struct data_desc
|
||||
|
@ -262,7 +262,7 @@ TEXT runtime·usleep(SB),NOSPLIT,$16
|
||||
|
||||
// set tls base to DI
|
||||
TEXT runtime·settls(SB),NOSPLIT,$8
|
||||
ADDQ $16, DI // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
|
||||
ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g and m
|
||||
MOVQ DI, 0(SP)
|
||||
MOVQ SP, SI
|
||||
MOVQ $129, DI // AMD64_SET_FSBASE
|
||||
|
@ -410,16 +410,16 @@ TEXT runtime·setldt(SB),NOSPLIT,$32
|
||||
* When linking against the system libraries,
|
||||
* we use its pthread_create and let it set up %gs
|
||||
* for us. When we do that, the private storage
|
||||
* we get is not at 0(GS), 4(GS), but -8(GS), -4(GS).
|
||||
* we get is not at 0(GS), but -4(GS).
|
||||
* To insulate the rest of the tool chain from this
|
||||
* ugliness, 8l rewrites 0(TLS) into -8(GS) for us.
|
||||
* ugliness, 8l rewrites 0(TLS) into -4(GS) for us.
|
||||
* To accommodate that rewrite, we translate
|
||||
* the address here and bump the limit to 0xffffffff (no limit)
|
||||
* so that -8(GS) maps to 0(address).
|
||||
* Also, the final 0(GS) (current 8(CX)) has to point
|
||||
* so that -4(GS) maps to 0(address).
|
||||
* Also, the final 0(GS) (current 4(CX)) has to point
|
||||
* to itself, to mimic ELF.
|
||||
*/
|
||||
ADDL $0x8, CX // address
|
||||
ADDL $0x4, CX // address
|
||||
MOVL CX, 0(CX)
|
||||
|
||||
// set up user_desc
|
||||
|
@ -359,7 +359,7 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
|
||||
|
||||
// set tls base to DI
|
||||
TEXT runtime·settls(SB),NOSPLIT,$32
|
||||
ADDQ $16, DI // ELF wants to use -16(FS), -8(FS)
|
||||
ADDQ $8, DI // ELF wants to use -8(FS)
|
||||
|
||||
MOVQ DI, SI
|
||||
MOVQ $0x1002, DI // ARCH_SET_FS
|
||||
|
@ -307,9 +307,9 @@ TEXT runtime·setldt(SB),NOSPLIT,$8
|
||||
RET
|
||||
|
||||
TEXT runtime·settls(SB),NOSPLIT,$16
|
||||
// adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
|
||||
// adjust for ELF: wants to use -4(GS) for g
|
||||
MOVL base+0(FP), CX
|
||||
ADDL $8, CX
|
||||
ADDL $4, CX
|
||||
MOVL $0, 0(SP) // syscall gap
|
||||
MOVL CX, 4(SP) // arg 1 - ptr
|
||||
MOVL $317, AX // sys__lwp_setprivate
|
||||
|
@ -307,8 +307,8 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
|
||||
|
||||
// set tls base to DI
|
||||
TEXT runtime·settls(SB),NOSPLIT,$8
|
||||
// adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
|
||||
ADDQ $16, DI // arg 1 - ptr
|
||||
// adjust for ELF: wants to use -8(FS) for g
|
||||
ADDQ $8, DI // arg 1 - ptr
|
||||
MOVQ $317, AX // sys__lwp_setprivate
|
||||
SYSCALL
|
||||
JCC 2(PC)
|
||||
|
@ -325,9 +325,9 @@ TEXT runtime·setldt(SB),NOSPLIT,$4
|
||||
RET
|
||||
|
||||
TEXT runtime·settls(SB),NOSPLIT,$8
|
||||
// adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
|
||||
// adjust for ELF: wants to use -4(GS) for g
|
||||
MOVL tlsbase+0(FP), CX
|
||||
ADDL $8, CX
|
||||
ADDL $4, CX
|
||||
MOVL $0, 0(SP) // syscall gap
|
||||
MOVL CX, 4(SP) // arg 1 - tcb
|
||||
MOVL $329, AX // sys___set_tcb
|
||||
|
@ -298,7 +298,7 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
|
||||
// set tls base to DI
|
||||
TEXT runtime·settls(SB),NOSPLIT,$0
|
||||
// adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
|
||||
ADDQ $16, DI
|
||||
ADDQ $8, DI
|
||||
MOVQ $329, AX // sys___settcb
|
||||
SYSCALL
|
||||
JCC 2(PC)
|
||||
|
Loading…
Reference in New Issue
Block a user