mirror of https://github.com/golang/go.git
cmd/internal/obj, cmd/link, runtime: native-ish support for tls on arm64
Fixes #10560 Change-Id: Iedffd9c236c4fbb386c3afc52c5a1457f96ef122 Reviewed-on: https://go-review.googlesource.com/13991 Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
492a62e945
commit
72180c3b82
|
|
@ -321,6 +321,7 @@ const (
|
|||
C_LOREG
|
||||
|
||||
C_ADDR // TODO(aram): explain difference from C_VCONADDR
|
||||
C_TLS // TLS var, i.e. memory address containing offset for the var
|
||||
C_ROFF // register offset (including register extended)
|
||||
|
||||
C_GOK
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ var cnames7 = []string{
|
|||
"UOREG64K",
|
||||
"LOREG",
|
||||
"ADDR",
|
||||
"TLS",
|
||||
"ROFF",
|
||||
"GOK",
|
||||
"TEXTSIZE",
|
||||
|
|
|
|||
|
|
@ -270,6 +270,7 @@ var optab = []Optab{
|
|||
{AMOVH, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
|
||||
{AMOVW, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
|
||||
{AMOVD, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
|
||||
{AMOVD, C_TLS, C_NONE, C_REG, 69, 4, 0, 0, 0},
|
||||
{AMUL, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0},
|
||||
{AMUL, C_REG, C_NONE, C_REG, 15, 4, 0, 0, 0},
|
||||
{AMADD, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0},
|
||||
|
|
@ -968,6 +969,9 @@ func aclass(ctxt *obj.Link, a *obj.Addr) int {
|
|||
}
|
||||
ctxt.Instoffset = a.Offset
|
||||
if a.Sym != nil { // use relocation
|
||||
if a.Sym.Type == obj.STLSBSS {
|
||||
return C_TLS
|
||||
}
|
||||
return C_ADDR
|
||||
}
|
||||
return C_LEXT
|
||||
|
|
@ -2753,6 +2757,18 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
|
|||
rel.Add = p.From.Offset
|
||||
rel.Type = obj.R_ADDRARM64
|
||||
|
||||
case 69: /* movd $tlsvar, reg -> movz reg, 0 + reloc */
|
||||
o1 = opirr(ctxt, AMOVZ)
|
||||
o1 |= uint32(p.To.Reg & 31)
|
||||
rel := obj.Addrel(ctxt.Cursym)
|
||||
rel.Off = int32(ctxt.Pc)
|
||||
rel.Siz = 4
|
||||
rel.Sym = p.From.Sym
|
||||
rel.Type = obj.R_ARM64_TLS_LE
|
||||
if p.From.Offset != 0 {
|
||||
ctxt.Diag("invalid offset on MOVW $tlsvar")
|
||||
}
|
||||
|
||||
// This is supposed to be something that stops execution.
|
||||
// It's not supposed to be reached, ever, but if it is, we'd
|
||||
// like to be able to tell how we got there. Assemble as
|
||||
|
|
|
|||
|
|
@ -432,6 +432,20 @@ const (
|
|||
R_USEFIELD
|
||||
R_POWER_TOC
|
||||
R_GOTPCREL
|
||||
|
||||
// Platform dependent relocations. Architectures with fixed width instructions
|
||||
// have the inherent issue that a 32-bit (or 64-bit!) displacement cannot be
|
||||
// stuffed into a 32-bit instruction, so an address needs to be spread across
|
||||
// several instructions, and in turn this requires a sequence of relocations, each
|
||||
// updating a part of an instruction. This leads to relocation codes that are
|
||||
// inherently processor specific.
|
||||
|
||||
// Arm64.
|
||||
|
||||
// Set a MOV[NZ] immediate field to bits [15:0] of the offset from the thread
|
||||
// local base to the thread local variable defined by the referenced (thread
|
||||
// local) symbol. Error if the offset does not fit into 16 bits.
|
||||
R_ARM64_TLS_LE
|
||||
)
|
||||
|
||||
type Auto struct {
|
||||
|
|
|
|||
|
|
@ -73,6 +73,9 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
|
|||
ld.Thearch.Vput(uint64(sectoff + 4))
|
||||
ld.Thearch.Vput(ld.R_AARCH64_ADD_ABS_LO12_NC | uint64(elfsym)<<32)
|
||||
|
||||
case obj.R_ARM64_TLS_LE:
|
||||
ld.Thearch.Vput(ld.R_AARCH64_TLSLE_MOVW_TPREL_G0 | uint64(elfsym)<<32)
|
||||
|
||||
case obj.R_CALLARM64:
|
||||
if r.Siz != 4 {
|
||||
return -1
|
||||
|
|
@ -225,7 +228,8 @@ func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int {
|
|||
|
||||
return 0
|
||||
|
||||
case obj.R_CALLARM64:
|
||||
case obj.R_CALLARM64,
|
||||
obj.R_ARM64_TLS_LE:
|
||||
r.Done = 0
|
||||
r.Xsym = r.Sym
|
||||
r.Xadd = r.Add
|
||||
|
|
@ -269,6 +273,20 @@ func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int {
|
|||
}
|
||||
return 0
|
||||
|
||||
case obj.R_ARM64_TLS_LE:
|
||||
r.Done = 0
|
||||
if ld.HEADTYPE != obj.Hlinux {
|
||||
ld.Diag("TLS reloc on unsupported OS %s", ld.Headstr(int(ld.HEADTYPE)))
|
||||
}
|
||||
// The TCB is two pointers. This is not documented anywhere, but is
|
||||
// de facto part of the ABI.
|
||||
v := r.Sym.Value + int64(2*ld.Thearch.Ptrsize)
|
||||
if v < 0 || v >= 32678 {
|
||||
ld.Diag("TLS offset out of range %d", v)
|
||||
}
|
||||
*val |= v << 5
|
||||
return 0
|
||||
|
||||
case obj.R_CALLARM64:
|
||||
t := (ld.Symaddr(r.Sym) + r.Add) - (s.Value + int64(r.Off))
|
||||
if t >= 1<<27 || t < -1<<27 {
|
||||
|
|
|
|||
|
|
@ -325,285 +325,294 @@ const (
|
|||
* Relocation types.
|
||||
*/
|
||||
const (
|
||||
R_X86_64_NONE = 0
|
||||
R_X86_64_64 = 1
|
||||
R_X86_64_PC32 = 2
|
||||
R_X86_64_GOT32 = 3
|
||||
R_X86_64_PLT32 = 4
|
||||
R_X86_64_COPY = 5
|
||||
R_X86_64_GLOB_DAT = 6
|
||||
R_X86_64_JMP_SLOT = 7
|
||||
R_X86_64_RELATIVE = 8
|
||||
R_X86_64_GOTPCREL = 9
|
||||
R_X86_64_32 = 10
|
||||
R_X86_64_32S = 11
|
||||
R_X86_64_16 = 12
|
||||
R_X86_64_PC16 = 13
|
||||
R_X86_64_8 = 14
|
||||
R_X86_64_PC8 = 15
|
||||
R_X86_64_DTPMOD64 = 16
|
||||
R_X86_64_DTPOFF64 = 17
|
||||
R_X86_64_TPOFF64 = 18
|
||||
R_X86_64_TLSGD = 19
|
||||
R_X86_64_TLSLD = 20
|
||||
R_X86_64_DTPOFF32 = 21
|
||||
R_X86_64_GOTTPOFF = 22
|
||||
R_X86_64_TPOFF32 = 23
|
||||
R_X86_64_COUNT = 24
|
||||
R_AARCH64_ABS64 = 257
|
||||
R_AARCH64_ABS32 = 258
|
||||
R_AARCH64_CALL26 = 283
|
||||
R_AARCH64_ADR_PREL_PG_HI21 = 275
|
||||
R_AARCH64_ADD_ABS_LO12_NC = 277
|
||||
R_ALPHA_NONE = 0
|
||||
R_ALPHA_REFLONG = 1
|
||||
R_ALPHA_REFQUAD = 2
|
||||
R_ALPHA_GPREL32 = 3
|
||||
R_ALPHA_LITERAL = 4
|
||||
R_ALPHA_LITUSE = 5
|
||||
R_ALPHA_GPDISP = 6
|
||||
R_ALPHA_BRADDR = 7
|
||||
R_ALPHA_HINT = 8
|
||||
R_ALPHA_SREL16 = 9
|
||||
R_ALPHA_SREL32 = 10
|
||||
R_ALPHA_SREL64 = 11
|
||||
R_ALPHA_OP_PUSH = 12
|
||||
R_ALPHA_OP_STORE = 13
|
||||
R_ALPHA_OP_PSUB = 14
|
||||
R_ALPHA_OP_PRSHIFT = 15
|
||||
R_ALPHA_GPVALUE = 16
|
||||
R_ALPHA_GPRELHIGH = 17
|
||||
R_ALPHA_GPRELLOW = 18
|
||||
R_ALPHA_IMMED_GP_16 = 19
|
||||
R_ALPHA_IMMED_GP_HI32 = 20
|
||||
R_ALPHA_IMMED_SCN_HI32 = 21
|
||||
R_ALPHA_IMMED_BR_HI32 = 22
|
||||
R_ALPHA_IMMED_LO32 = 23
|
||||
R_ALPHA_COPY = 24
|
||||
R_ALPHA_GLOB_DAT = 25
|
||||
R_ALPHA_JMP_SLOT = 26
|
||||
R_ALPHA_RELATIVE = 27
|
||||
R_ALPHA_COUNT = 28
|
||||
R_ARM_NONE = 0
|
||||
R_ARM_PC24 = 1
|
||||
R_ARM_ABS32 = 2
|
||||
R_ARM_REL32 = 3
|
||||
R_ARM_PC13 = 4
|
||||
R_ARM_ABS16 = 5
|
||||
R_ARM_ABS12 = 6
|
||||
R_ARM_THM_ABS5 = 7
|
||||
R_ARM_ABS8 = 8
|
||||
R_ARM_SBREL32 = 9
|
||||
R_ARM_THM_PC22 = 10
|
||||
R_ARM_THM_PC8 = 11
|
||||
R_ARM_AMP_VCALL9 = 12
|
||||
R_ARM_SWI24 = 13
|
||||
R_ARM_THM_SWI8 = 14
|
||||
R_ARM_XPC25 = 15
|
||||
R_ARM_THM_XPC22 = 16
|
||||
R_ARM_COPY = 20
|
||||
R_ARM_GLOB_DAT = 21
|
||||
R_ARM_JUMP_SLOT = 22
|
||||
R_ARM_RELATIVE = 23
|
||||
R_ARM_GOTOFF = 24
|
||||
R_ARM_GOTPC = 25
|
||||
R_ARM_GOT32 = 26
|
||||
R_ARM_PLT32 = 27
|
||||
R_ARM_CALL = 28
|
||||
R_ARM_JUMP24 = 29
|
||||
R_ARM_V4BX = 40
|
||||
R_ARM_GOT_PREL = 96
|
||||
R_ARM_GNU_VTENTRY = 100
|
||||
R_ARM_GNU_VTINHERIT = 101
|
||||
R_ARM_TLS_IE32 = 107
|
||||
R_ARM_TLS_LE32 = 108
|
||||
R_ARM_RSBREL32 = 250
|
||||
R_ARM_THM_RPC22 = 251
|
||||
R_ARM_RREL32 = 252
|
||||
R_ARM_RABS32 = 253
|
||||
R_ARM_RPC24 = 254
|
||||
R_ARM_RBASE = 255
|
||||
R_ARM_COUNT = 38
|
||||
R_386_NONE = 0
|
||||
R_386_32 = 1
|
||||
R_386_PC32 = 2
|
||||
R_386_GOT32 = 3
|
||||
R_386_PLT32 = 4
|
||||
R_386_COPY = 5
|
||||
R_386_GLOB_DAT = 6
|
||||
R_386_JMP_SLOT = 7
|
||||
R_386_RELATIVE = 8
|
||||
R_386_GOTOFF = 9
|
||||
R_386_GOTPC = 10
|
||||
R_386_TLS_TPOFF = 14
|
||||
R_386_TLS_IE = 15
|
||||
R_386_TLS_GOTIE = 16
|
||||
R_386_TLS_LE = 17
|
||||
R_386_TLS_GD = 18
|
||||
R_386_TLS_LDM = 19
|
||||
R_386_TLS_GD_32 = 24
|
||||
R_386_TLS_GD_PUSH = 25
|
||||
R_386_TLS_GD_CALL = 26
|
||||
R_386_TLS_GD_POP = 27
|
||||
R_386_TLS_LDM_32 = 28
|
||||
R_386_TLS_LDM_PUSH = 29
|
||||
R_386_TLS_LDM_CALL = 30
|
||||
R_386_TLS_LDM_POP = 31
|
||||
R_386_TLS_LDO_32 = 32
|
||||
R_386_TLS_IE_32 = 33
|
||||
R_386_TLS_LE_32 = 34
|
||||
R_386_TLS_DTPMOD32 = 35
|
||||
R_386_TLS_DTPOFF32 = 36
|
||||
R_386_TLS_TPOFF32 = 37
|
||||
R_386_COUNT = 38
|
||||
R_PPC_NONE = 0
|
||||
R_PPC_ADDR32 = 1
|
||||
R_PPC_ADDR24 = 2
|
||||
R_PPC_ADDR16 = 3
|
||||
R_PPC_ADDR16_LO = 4
|
||||
R_PPC_ADDR16_HI = 5
|
||||
R_PPC_ADDR16_HA = 6
|
||||
R_PPC_ADDR14 = 7
|
||||
R_PPC_ADDR14_BRTAKEN = 8
|
||||
R_PPC_ADDR14_BRNTAKEN = 9
|
||||
R_PPC_REL24 = 10
|
||||
R_PPC_REL14 = 11
|
||||
R_PPC_REL14_BRTAKEN = 12
|
||||
R_PPC_REL14_BRNTAKEN = 13
|
||||
R_PPC_GOT16 = 14
|
||||
R_PPC_GOT16_LO = 15
|
||||
R_PPC_GOT16_HI = 16
|
||||
R_PPC_GOT16_HA = 17
|
||||
R_PPC_PLTREL24 = 18
|
||||
R_PPC_COPY = 19
|
||||
R_PPC_GLOB_DAT = 20
|
||||
R_PPC_JMP_SLOT = 21
|
||||
R_PPC_RELATIVE = 22
|
||||
R_PPC_LOCAL24PC = 23
|
||||
R_PPC_UADDR32 = 24
|
||||
R_PPC_UADDR16 = 25
|
||||
R_PPC_REL32 = 26
|
||||
R_PPC_PLT32 = 27
|
||||
R_PPC_PLTREL32 = 28
|
||||
R_PPC_PLT16_LO = 29
|
||||
R_PPC_PLT16_HI = 30
|
||||
R_PPC_PLT16_HA = 31
|
||||
R_PPC_SDAREL16 = 32
|
||||
R_PPC_SECTOFF = 33
|
||||
R_PPC_SECTOFF_LO = 34
|
||||
R_PPC_SECTOFF_HI = 35
|
||||
R_PPC_SECTOFF_HA = 36
|
||||
R_PPC_COUNT = 37
|
||||
R_PPC_TLS = 67
|
||||
R_PPC_DTPMOD32 = 68
|
||||
R_PPC_TPREL16 = 69
|
||||
R_PPC_TPREL16_LO = 70
|
||||
R_PPC_TPREL16_HI = 71
|
||||
R_PPC_TPREL16_HA = 72
|
||||
R_PPC_TPREL32 = 73
|
||||
R_PPC_DTPREL16 = 74
|
||||
R_PPC_DTPREL16_LO = 75
|
||||
R_PPC_DTPREL16_HI = 76
|
||||
R_PPC_DTPREL16_HA = 77
|
||||
R_PPC_DTPREL32 = 78
|
||||
R_PPC_GOT_TLSGD16 = 79
|
||||
R_PPC_GOT_TLSGD16_LO = 80
|
||||
R_PPC_GOT_TLSGD16_HI = 81
|
||||
R_PPC_GOT_TLSGD16_HA = 82
|
||||
R_PPC_GOT_TLSLD16 = 83
|
||||
R_PPC_GOT_TLSLD16_LO = 84
|
||||
R_PPC_GOT_TLSLD16_HI = 85
|
||||
R_PPC_GOT_TLSLD16_HA = 86
|
||||
R_PPC_GOT_TPREL16 = 87
|
||||
R_PPC_GOT_TPREL16_LO = 88
|
||||
R_PPC_GOT_TPREL16_HI = 89
|
||||
R_PPC_GOT_TPREL16_HA = 90
|
||||
R_PPC_EMB_NADDR32 = 101
|
||||
R_PPC_EMB_NADDR16 = 102
|
||||
R_PPC_EMB_NADDR16_LO = 103
|
||||
R_PPC_EMB_NADDR16_HI = 104
|
||||
R_PPC_EMB_NADDR16_HA = 105
|
||||
R_PPC_EMB_SDAI16 = 106
|
||||
R_PPC_EMB_SDA2I16 = 107
|
||||
R_PPC_EMB_SDA2REL = 108
|
||||
R_PPC_EMB_SDA21 = 109
|
||||
R_PPC_EMB_MRKREF = 110
|
||||
R_PPC_EMB_RELSEC16 = 111
|
||||
R_PPC_EMB_RELST_LO = 112
|
||||
R_PPC_EMB_RELST_HI = 113
|
||||
R_PPC_EMB_RELST_HA = 114
|
||||
R_PPC_EMB_BIT_FLD = 115
|
||||
R_PPC_EMB_RELSDA = 116
|
||||
R_PPC_EMB_COUNT = R_PPC_EMB_RELSDA - R_PPC_EMB_NADDR32 + 1
|
||||
R_PPC64_REL24 = R_PPC_REL24
|
||||
R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT
|
||||
R_PPC64_ADDR64 = 38
|
||||
R_PPC64_TOC16 = 47
|
||||
R_PPC64_TOC16_LO = 48
|
||||
R_PPC64_TOC16_HI = 49
|
||||
R_PPC64_TOC16_HA = 50
|
||||
R_PPC64_TOC16_DS = 63
|
||||
R_PPC64_TOC16_LO_DS = 64
|
||||
R_PPC64_REL16_LO = 250
|
||||
R_PPC64_REL16_HI = 251
|
||||
R_PPC64_REL16_HA = 252
|
||||
R_SPARC_NONE = 0
|
||||
R_SPARC_8 = 1
|
||||
R_SPARC_16 = 2
|
||||
R_SPARC_32 = 3
|
||||
R_SPARC_DISP8 = 4
|
||||
R_SPARC_DISP16 = 5
|
||||
R_SPARC_DISP32 = 6
|
||||
R_SPARC_WDISP30 = 7
|
||||
R_SPARC_WDISP22 = 8
|
||||
R_SPARC_HI22 = 9
|
||||
R_SPARC_22 = 10
|
||||
R_SPARC_13 = 11
|
||||
R_SPARC_LO10 = 12
|
||||
R_SPARC_GOT10 = 13
|
||||
R_SPARC_GOT13 = 14
|
||||
R_SPARC_GOT22 = 15
|
||||
R_SPARC_PC10 = 16
|
||||
R_SPARC_PC22 = 17
|
||||
R_SPARC_WPLT30 = 18
|
||||
R_SPARC_COPY = 19
|
||||
R_SPARC_GLOB_DAT = 20
|
||||
R_SPARC_JMP_SLOT = 21
|
||||
R_SPARC_RELATIVE = 22
|
||||
R_SPARC_UA32 = 23
|
||||
R_SPARC_PLT32 = 24
|
||||
R_SPARC_HIPLT22 = 25
|
||||
R_SPARC_LOPLT10 = 26
|
||||
R_SPARC_PCPLT32 = 27
|
||||
R_SPARC_PCPLT22 = 28
|
||||
R_SPARC_PCPLT10 = 29
|
||||
R_SPARC_10 = 30
|
||||
R_SPARC_11 = 31
|
||||
R_SPARC_64 = 32
|
||||
R_SPARC_OLO10 = 33
|
||||
R_SPARC_HH22 = 34
|
||||
R_SPARC_HM10 = 35
|
||||
R_SPARC_LM22 = 36
|
||||
R_SPARC_PC_HH22 = 37
|
||||
R_SPARC_PC_HM10 = 38
|
||||
R_SPARC_PC_LM22 = 39
|
||||
R_SPARC_WDISP16 = 40
|
||||
R_SPARC_WDISP19 = 41
|
||||
R_SPARC_GLOB_JMP = 42
|
||||
R_SPARC_7 = 43
|
||||
R_SPARC_5 = 44
|
||||
R_SPARC_6 = 45
|
||||
R_SPARC_DISP64 = 46
|
||||
R_SPARC_PLT64 = 47
|
||||
R_SPARC_HIX22 = 48
|
||||
R_SPARC_LOX10 = 49
|
||||
R_SPARC_H44 = 50
|
||||
R_SPARC_M44 = 51
|
||||
R_SPARC_L44 = 52
|
||||
R_SPARC_REGISTER = 53
|
||||
R_SPARC_UA64 = 54
|
||||
R_SPARC_UA16 = 55
|
||||
ARM_MAGIC_TRAMP_NUMBER = 0x5c000003
|
||||
R_X86_64_NONE = 0
|
||||
R_X86_64_64 = 1
|
||||
R_X86_64_PC32 = 2
|
||||
R_X86_64_GOT32 = 3
|
||||
R_X86_64_PLT32 = 4
|
||||
R_X86_64_COPY = 5
|
||||
R_X86_64_GLOB_DAT = 6
|
||||
R_X86_64_JMP_SLOT = 7
|
||||
R_X86_64_RELATIVE = 8
|
||||
R_X86_64_GOTPCREL = 9
|
||||
R_X86_64_32 = 10
|
||||
R_X86_64_32S = 11
|
||||
R_X86_64_16 = 12
|
||||
R_X86_64_PC16 = 13
|
||||
R_X86_64_8 = 14
|
||||
R_X86_64_PC8 = 15
|
||||
R_X86_64_DTPMOD64 = 16
|
||||
R_X86_64_DTPOFF64 = 17
|
||||
R_X86_64_TPOFF64 = 18
|
||||
R_X86_64_TLSGD = 19
|
||||
R_X86_64_TLSLD = 20
|
||||
R_X86_64_DTPOFF32 = 21
|
||||
R_X86_64_GOTTPOFF = 22
|
||||
R_X86_64_TPOFF32 = 23
|
||||
R_X86_64_COUNT = 24
|
||||
|
||||
R_AARCH64_ABS64 = 257
|
||||
R_AARCH64_ABS32 = 258
|
||||
R_AARCH64_CALL26 = 283
|
||||
R_AARCH64_ADR_PREL_PG_HI21 = 275
|
||||
R_AARCH64_ADD_ABS_LO12_NC = 277
|
||||
R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547
|
||||
|
||||
R_ALPHA_NONE = 0
|
||||
R_ALPHA_REFLONG = 1
|
||||
R_ALPHA_REFQUAD = 2
|
||||
R_ALPHA_GPREL32 = 3
|
||||
R_ALPHA_LITERAL = 4
|
||||
R_ALPHA_LITUSE = 5
|
||||
R_ALPHA_GPDISP = 6
|
||||
R_ALPHA_BRADDR = 7
|
||||
R_ALPHA_HINT = 8
|
||||
R_ALPHA_SREL16 = 9
|
||||
R_ALPHA_SREL32 = 10
|
||||
R_ALPHA_SREL64 = 11
|
||||
R_ALPHA_OP_PUSH = 12
|
||||
R_ALPHA_OP_STORE = 13
|
||||
R_ALPHA_OP_PSUB = 14
|
||||
R_ALPHA_OP_PRSHIFT = 15
|
||||
R_ALPHA_GPVALUE = 16
|
||||
R_ALPHA_GPRELHIGH = 17
|
||||
R_ALPHA_GPRELLOW = 18
|
||||
R_ALPHA_IMMED_GP_16 = 19
|
||||
R_ALPHA_IMMED_GP_HI32 = 20
|
||||
R_ALPHA_IMMED_SCN_HI32 = 21
|
||||
R_ALPHA_IMMED_BR_HI32 = 22
|
||||
R_ALPHA_IMMED_LO32 = 23
|
||||
R_ALPHA_COPY = 24
|
||||
R_ALPHA_GLOB_DAT = 25
|
||||
R_ALPHA_JMP_SLOT = 26
|
||||
R_ALPHA_RELATIVE = 27
|
||||
R_ALPHA_COUNT = 28
|
||||
|
||||
R_ARM_NONE = 0
|
||||
R_ARM_PC24 = 1
|
||||
R_ARM_ABS32 = 2
|
||||
R_ARM_REL32 = 3
|
||||
R_ARM_PC13 = 4
|
||||
R_ARM_ABS16 = 5
|
||||
R_ARM_ABS12 = 6
|
||||
R_ARM_THM_ABS5 = 7
|
||||
R_ARM_ABS8 = 8
|
||||
R_ARM_SBREL32 = 9
|
||||
R_ARM_THM_PC22 = 10
|
||||
R_ARM_THM_PC8 = 11
|
||||
R_ARM_AMP_VCALL9 = 12
|
||||
R_ARM_SWI24 = 13
|
||||
R_ARM_THM_SWI8 = 14
|
||||
R_ARM_XPC25 = 15
|
||||
R_ARM_THM_XPC22 = 16
|
||||
R_ARM_COPY = 20
|
||||
R_ARM_GLOB_DAT = 21
|
||||
R_ARM_JUMP_SLOT = 22
|
||||
R_ARM_RELATIVE = 23
|
||||
R_ARM_GOTOFF = 24
|
||||
R_ARM_GOTPC = 25
|
||||
R_ARM_GOT32 = 26
|
||||
R_ARM_PLT32 = 27
|
||||
R_ARM_CALL = 28
|
||||
R_ARM_JUMP24 = 29
|
||||
R_ARM_V4BX = 40
|
||||
R_ARM_GOT_PREL = 96
|
||||
R_ARM_GNU_VTENTRY = 100
|
||||
R_ARM_GNU_VTINHERIT = 101
|
||||
R_ARM_TLS_IE32 = 107
|
||||
R_ARM_TLS_LE32 = 108
|
||||
R_ARM_RSBREL32 = 250
|
||||
R_ARM_THM_RPC22 = 251
|
||||
R_ARM_RREL32 = 252
|
||||
R_ARM_RABS32 = 253
|
||||
R_ARM_RPC24 = 254
|
||||
R_ARM_RBASE = 255
|
||||
R_ARM_COUNT = 38
|
||||
|
||||
R_386_NONE = 0
|
||||
R_386_32 = 1
|
||||
R_386_PC32 = 2
|
||||
R_386_GOT32 = 3
|
||||
R_386_PLT32 = 4
|
||||
R_386_COPY = 5
|
||||
R_386_GLOB_DAT = 6
|
||||
R_386_JMP_SLOT = 7
|
||||
R_386_RELATIVE = 8
|
||||
R_386_GOTOFF = 9
|
||||
R_386_GOTPC = 10
|
||||
R_386_TLS_TPOFF = 14
|
||||
R_386_TLS_IE = 15
|
||||
R_386_TLS_GOTIE = 16
|
||||
R_386_TLS_LE = 17
|
||||
R_386_TLS_GD = 18
|
||||
R_386_TLS_LDM = 19
|
||||
R_386_TLS_GD_32 = 24
|
||||
R_386_TLS_GD_PUSH = 25
|
||||
R_386_TLS_GD_CALL = 26
|
||||
R_386_TLS_GD_POP = 27
|
||||
R_386_TLS_LDM_32 = 28
|
||||
R_386_TLS_LDM_PUSH = 29
|
||||
R_386_TLS_LDM_CALL = 30
|
||||
R_386_TLS_LDM_POP = 31
|
||||
R_386_TLS_LDO_32 = 32
|
||||
R_386_TLS_IE_32 = 33
|
||||
R_386_TLS_LE_32 = 34
|
||||
R_386_TLS_DTPMOD32 = 35
|
||||
R_386_TLS_DTPOFF32 = 36
|
||||
R_386_TLS_TPOFF32 = 37
|
||||
R_386_COUNT = 38
|
||||
|
||||
R_PPC_NONE = 0
|
||||
R_PPC_ADDR32 = 1
|
||||
R_PPC_ADDR24 = 2
|
||||
R_PPC_ADDR16 = 3
|
||||
R_PPC_ADDR16_LO = 4
|
||||
R_PPC_ADDR16_HI = 5
|
||||
R_PPC_ADDR16_HA = 6
|
||||
R_PPC_ADDR14 = 7
|
||||
R_PPC_ADDR14_BRTAKEN = 8
|
||||
R_PPC_ADDR14_BRNTAKEN = 9
|
||||
R_PPC_REL24 = 10
|
||||
R_PPC_REL14 = 11
|
||||
R_PPC_REL14_BRTAKEN = 12
|
||||
R_PPC_REL14_BRNTAKEN = 13
|
||||
R_PPC_GOT16 = 14
|
||||
R_PPC_GOT16_LO = 15
|
||||
R_PPC_GOT16_HI = 16
|
||||
R_PPC_GOT16_HA = 17
|
||||
R_PPC_PLTREL24 = 18
|
||||
R_PPC_COPY = 19
|
||||
R_PPC_GLOB_DAT = 20
|
||||
R_PPC_JMP_SLOT = 21
|
||||
R_PPC_RELATIVE = 22
|
||||
R_PPC_LOCAL24PC = 23
|
||||
R_PPC_UADDR32 = 24
|
||||
R_PPC_UADDR16 = 25
|
||||
R_PPC_REL32 = 26
|
||||
R_PPC_PLT32 = 27
|
||||
R_PPC_PLTREL32 = 28
|
||||
R_PPC_PLT16_LO = 29
|
||||
R_PPC_PLT16_HI = 30
|
||||
R_PPC_PLT16_HA = 31
|
||||
R_PPC_SDAREL16 = 32
|
||||
R_PPC_SECTOFF = 33
|
||||
R_PPC_SECTOFF_LO = 34
|
||||
R_PPC_SECTOFF_HI = 35
|
||||
R_PPC_SECTOFF_HA = 36
|
||||
R_PPC_COUNT = 37
|
||||
R_PPC_TLS = 67
|
||||
R_PPC_DTPMOD32 = 68
|
||||
R_PPC_TPREL16 = 69
|
||||
R_PPC_TPREL16_LO = 70
|
||||
R_PPC_TPREL16_HI = 71
|
||||
R_PPC_TPREL16_HA = 72
|
||||
R_PPC_TPREL32 = 73
|
||||
R_PPC_DTPREL16 = 74
|
||||
R_PPC_DTPREL16_LO = 75
|
||||
R_PPC_DTPREL16_HI = 76
|
||||
R_PPC_DTPREL16_HA = 77
|
||||
R_PPC_DTPREL32 = 78
|
||||
R_PPC_GOT_TLSGD16 = 79
|
||||
R_PPC_GOT_TLSGD16_LO = 80
|
||||
R_PPC_GOT_TLSGD16_HI = 81
|
||||
R_PPC_GOT_TLSGD16_HA = 82
|
||||
R_PPC_GOT_TLSLD16 = 83
|
||||
R_PPC_GOT_TLSLD16_LO = 84
|
||||
R_PPC_GOT_TLSLD16_HI = 85
|
||||
R_PPC_GOT_TLSLD16_HA = 86
|
||||
R_PPC_GOT_TPREL16 = 87
|
||||
R_PPC_GOT_TPREL16_LO = 88
|
||||
R_PPC_GOT_TPREL16_HI = 89
|
||||
R_PPC_GOT_TPREL16_HA = 90
|
||||
R_PPC_EMB_NADDR32 = 101
|
||||
R_PPC_EMB_NADDR16 = 102
|
||||
R_PPC_EMB_NADDR16_LO = 103
|
||||
R_PPC_EMB_NADDR16_HI = 104
|
||||
R_PPC_EMB_NADDR16_HA = 105
|
||||
R_PPC_EMB_SDAI16 = 106
|
||||
R_PPC_EMB_SDA2I16 = 107
|
||||
R_PPC_EMB_SDA2REL = 108
|
||||
R_PPC_EMB_SDA21 = 109
|
||||
R_PPC_EMB_MRKREF = 110
|
||||
R_PPC_EMB_RELSEC16 = 111
|
||||
R_PPC_EMB_RELST_LO = 112
|
||||
R_PPC_EMB_RELST_HI = 113
|
||||
R_PPC_EMB_RELST_HA = 114
|
||||
R_PPC_EMB_BIT_FLD = 115
|
||||
R_PPC_EMB_RELSDA = 116
|
||||
R_PPC_EMB_COUNT = R_PPC_EMB_RELSDA - R_PPC_EMB_NADDR32 + 1
|
||||
|
||||
R_PPC64_REL24 = R_PPC_REL24
|
||||
R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT
|
||||
R_PPC64_ADDR64 = 38
|
||||
R_PPC64_TOC16 = 47
|
||||
R_PPC64_TOC16_LO = 48
|
||||
R_PPC64_TOC16_HI = 49
|
||||
R_PPC64_TOC16_HA = 50
|
||||
R_PPC64_TOC16_DS = 63
|
||||
R_PPC64_TOC16_LO_DS = 64
|
||||
R_PPC64_REL16_LO = 250
|
||||
R_PPC64_REL16_HI = 251
|
||||
R_PPC64_REL16_HA = 252
|
||||
|
||||
R_SPARC_NONE = 0
|
||||
R_SPARC_8 = 1
|
||||
R_SPARC_16 = 2
|
||||
R_SPARC_32 = 3
|
||||
R_SPARC_DISP8 = 4
|
||||
R_SPARC_DISP16 = 5
|
||||
R_SPARC_DISP32 = 6
|
||||
R_SPARC_WDISP30 = 7
|
||||
R_SPARC_WDISP22 = 8
|
||||
R_SPARC_HI22 = 9
|
||||
R_SPARC_22 = 10
|
||||
R_SPARC_13 = 11
|
||||
R_SPARC_LO10 = 12
|
||||
R_SPARC_GOT10 = 13
|
||||
R_SPARC_GOT13 = 14
|
||||
R_SPARC_GOT22 = 15
|
||||
R_SPARC_PC10 = 16
|
||||
R_SPARC_PC22 = 17
|
||||
R_SPARC_WPLT30 = 18
|
||||
R_SPARC_COPY = 19
|
||||
R_SPARC_GLOB_DAT = 20
|
||||
R_SPARC_JMP_SLOT = 21
|
||||
R_SPARC_RELATIVE = 22
|
||||
R_SPARC_UA32 = 23
|
||||
R_SPARC_PLT32 = 24
|
||||
R_SPARC_HIPLT22 = 25
|
||||
R_SPARC_LOPLT10 = 26
|
||||
R_SPARC_PCPLT32 = 27
|
||||
R_SPARC_PCPLT22 = 28
|
||||
R_SPARC_PCPLT10 = 29
|
||||
R_SPARC_10 = 30
|
||||
R_SPARC_11 = 31
|
||||
R_SPARC_64 = 32
|
||||
R_SPARC_OLO10 = 33
|
||||
R_SPARC_HH22 = 34
|
||||
R_SPARC_HM10 = 35
|
||||
R_SPARC_LM22 = 36
|
||||
R_SPARC_PC_HH22 = 37
|
||||
R_SPARC_PC_HM10 = 38
|
||||
R_SPARC_PC_LM22 = 39
|
||||
R_SPARC_WDISP16 = 40
|
||||
R_SPARC_WDISP19 = 41
|
||||
R_SPARC_GLOB_JMP = 42
|
||||
R_SPARC_7 = 43
|
||||
R_SPARC_5 = 44
|
||||
R_SPARC_6 = 45
|
||||
R_SPARC_DISP64 = 46
|
||||
R_SPARC_PLT64 = 47
|
||||
R_SPARC_HIX22 = 48
|
||||
R_SPARC_LOX10 = 49
|
||||
R_SPARC_H44 = 50
|
||||
R_SPARC_M44 = 51
|
||||
R_SPARC_L44 = 52
|
||||
R_SPARC_REGISTER = 53
|
||||
R_SPARC_UA64 = 54
|
||||
R_SPARC_UA16 = 55
|
||||
|
||||
ARM_MAGIC_TRAMP_NUMBER = 0x5c000003
|
||||
)
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$0
|
|||
#ifdef TLSG_IS_VARIABLE
|
||||
MOVD $runtime·tls_g(SB), R2 // arg 2: &tls_g
|
||||
#else
|
||||
MOVD 0, R2 // arg 2: not used when using platform's TLS
|
||||
MOVD $0, R2 // arg 2: not used when using platform's TLS
|
||||
#endif
|
||||
MOVD $setg_gcc<>(SB), R1 // arg 1: setg
|
||||
MOVD g, R0 // arg 0: G
|
||||
|
|
|
|||
|
|
@ -18,13 +18,8 @@ TEXT runtime·load_g(SB),NOSPLIT,$0
|
|||
// Darwin sometimes returns unaligned pointers
|
||||
AND $0xfffffffffffffff8, R0
|
||||
#endif
|
||||
#ifdef TLSG_IS_VARIABLE
|
||||
MOVD runtime·tls_g(SB), R27
|
||||
ADD R27, R0
|
||||
#else
|
||||
// TODO(minux): use real TLS relocation, instead of hard-code for Linux
|
||||
ADD $0x10, R0
|
||||
#endif
|
||||
MOVD 0(R0), g
|
||||
|
||||
nocgo:
|
||||
|
|
@ -40,13 +35,8 @@ TEXT runtime·save_g(SB),NOSPLIT,$0
|
|||
// Darwin sometimes returns unaligned pointers
|
||||
AND $0xfffffffffffffff8, R0
|
||||
#endif
|
||||
#ifdef TLSG_IS_VARIABLE
|
||||
MOVD runtime·tls_g(SB), R27
|
||||
ADD R27, R0
|
||||
#else
|
||||
// TODO(minux): use real TLS relocation, instead of hard-code for Linux
|
||||
ADD $0x10, R0
|
||||
#endif
|
||||
MOVD g, 0(R0)
|
||||
|
||||
nocgo:
|
||||
|
|
@ -54,4 +44,6 @@ nocgo:
|
|||
|
||||
#ifdef TLSG_IS_VARIABLE
|
||||
GLOBL runtime·tls_g+0(SB), NOPTR, $8
|
||||
#else
|
||||
GLOBL runtime·tls_g+0(SB), TLSBSS, $8
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue