github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/cmd/internal/objabi/reloctype.go (about) 1 // Derived from Inferno utils/6l/l.h and related files. 2 // https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) 6 // Portions Copyright © 1997-1999 Vita Nuova Limited 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) 8 // Portions Copyright © 2004,2006 Bruce Ellis 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others 11 // Portions Copyright © 2009 The Go Authors. All rights reserved. 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining a copy 14 // of this software and associated documentation files (the "Software"), to deal 15 // in the Software without restriction, including without limitation the rights 16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 // copies of the Software, and to permit persons to whom the Software is 18 // furnished to do so, subject to the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be included in 21 // all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 // THE SOFTWARE. 30 31 package objabi 32 33 type RelocType int32 34 35 //go:generate stringer -type=RelocType 36 const ( 37 R_ADDR RelocType = 1 + iota 38 // R_ADDRPOWER relocates a pair of "D-form" instructions (instructions with 16-bit 39 // immediates in the low half of the instruction word), usually addis followed by 40 // another add or a load, inserting the "high adjusted" 16 bits of the address of 41 // the referenced symbol into the immediate field of the first instruction and the 42 // low 16 bits into that of the second instruction. 43 R_ADDRPOWER 44 // R_ADDRARM64 relocates an adrp, add pair to compute the address of the 45 // referenced symbol. 46 R_ADDRARM64 47 // R_ADDRMIPS (only used on mips/mips64) resolves to the low 16 bits of an external 48 // address, by encoding it into the instruction. 49 R_ADDRMIPS 50 // R_ADDROFF resolves to a 32-bit offset from the beginning of the section 51 // holding the data being relocated to the referenced symbol. 52 R_ADDROFF 53 // R_WEAKADDROFF resolves just like R_ADDROFF but is a weak relocation. 54 // A weak relocation does not make the symbol it refers to reachable, 55 // and is only honored by the linker if the symbol is in some other way 56 // reachable. 57 R_WEAKADDROFF 58 R_SIZE 59 R_CALL 60 R_CALLARM 61 R_CALLARM64 62 R_CALLIND 63 R_CALLPOWER 64 // R_CALLMIPS (only used on mips64) resolves to non-PC-relative target address 65 // of a CALL (JAL) instruction, by encoding the address into the instruction. 66 R_CALLMIPS 67 R_CONST 68 R_PCREL 69 // R_TLS_LE, used on 386, amd64, and ARM, resolves to the offset of the 70 // thread-local symbol from the thread local base and is used to implement the 71 // "local exec" model for tls access (r.Sym is not set on intel platforms but is 72 // set to a TLS symbol -- runtime.tlsg -- in the linker when externally linking). 73 R_TLS_LE 74 // R_TLS_IE, used 386, amd64, and ARM resolves to the PC-relative offset to a GOT 75 // slot containing the offset from the thread-local symbol from the thread local 76 // base and is used to implemented the "initial exec" model for tls access (r.Sym 77 // is not set on intel platforms but is set to a TLS symbol -- runtime.tlsg -- in 78 // the linker when externally linking). 79 R_TLS_IE 80 R_GOTOFF 81 R_PLT0 82 R_PLT1 83 R_PLT2 84 R_USEFIELD 85 // R_USETYPE resolves to an *rtype, but no relocation is created. The 86 // linker uses this as a signal that the pointed-to type information 87 // should be linked into the final binary, even if there are no other 88 // direct references. (This is used for types reachable by reflection.) 89 R_USETYPE 90 // R_METHODOFF resolves to a 32-bit offset from the beginning of the section 91 // holding the data being relocated to the referenced symbol. 92 // It is a variant of R_ADDROFF used when linking from the uncommonType of a 93 // *rtype, and may be set to zero by the linker if it determines the method 94 // text is unreachable by the linked program. 95 R_METHODOFF 96 R_POWER_TOC 97 R_GOTPCREL 98 // R_JMPMIPS (only used on mips64) resolves to non-PC-relative target address 99 // of a JMP instruction, by encoding the address into the instruction. 100 // The stack nosplit check ignores this since it is not a function call. 101 R_JMPMIPS 102 // R_DWARFREF resolves to the offset of the symbol from its section. 103 R_DWARFREF 104 105 // Platform dependent relocations. Architectures with fixed width instructions 106 // have the inherent issue that a 32-bit (or 64-bit!) displacement cannot be 107 // stuffed into a 32-bit instruction, so an address needs to be spread across 108 // several instructions, and in turn this requires a sequence of relocations, each 109 // updating a part of an instruction. This leads to relocation codes that are 110 // inherently processor specific. 111 112 // Arm64. 113 114 // Set a MOV[NZ] immediate field to bits [15:0] of the offset from the thread 115 // local base to the thread local variable defined by the referenced (thread 116 // local) symbol. Error if the offset does not fit into 16 bits. 117 R_ARM64_TLS_LE 118 119 // Relocates an ADRP; LD64 instruction sequence to load the offset between 120 // the thread local base and the thread local variable defined by the 121 // referenced (thread local) symbol from the GOT. 122 R_ARM64_TLS_IE 123 124 // R_ARM64_GOTPCREL relocates an adrp, ld64 pair to compute the address of the GOT 125 // slot of the referenced symbol. 126 R_ARM64_GOTPCREL 127 128 // PPC64. 129 130 // R_POWER_TLS_LE is used to implement the "local exec" model for tls 131 // access. It resolves to the offset of the thread-local symbol from the 132 // thread pointer (R13) and inserts this value into the low 16 bits of an 133 // instruction word. 134 R_POWER_TLS_LE 135 136 // R_POWER_TLS_IE is used to implement the "initial exec" model for tls access. It 137 // relocates a D-form, DS-form instruction sequence like R_ADDRPOWER_DS. It 138 // inserts to the offset of GOT slot for the thread-local symbol from the TOC (the 139 // GOT slot is filled by the dynamic linker with the offset of the thread-local 140 // symbol from the thread pointer (R13)). 141 R_POWER_TLS_IE 142 143 // R_POWER_TLS marks an X-form instruction such as "MOVD 0(R13)(R31*1), g" as 144 // accessing a particular thread-local symbol. It does not affect code generation 145 // but is used by the system linker when relaxing "initial exec" model code to 146 // "local exec" model code. 147 R_POWER_TLS 148 149 // R_ADDRPOWER_DS is similar to R_ADDRPOWER above, but assumes the second 150 // instruction is a "DS-form" instruction, which has an immediate field occupying 151 // bits [15:2] of the instruction word. Bits [15:2] of the address of the 152 // relocated symbol are inserted into this field; it is an error if the last two 153 // bits of the address are not 0. 154 R_ADDRPOWER_DS 155 156 // R_ADDRPOWER_PCREL relocates a D-form, DS-form instruction sequence like 157 // R_ADDRPOWER_DS but inserts the offset of the GOT slot for the referenced symbol 158 // from the TOC rather than the symbol's address. 159 R_ADDRPOWER_GOT 160 161 // R_ADDRPOWER_PCREL relocates two D-form instructions like R_ADDRPOWER, but 162 // inserts the displacement from the place being relocated to the address of the 163 // the relocated symbol instead of just its address. 164 R_ADDRPOWER_PCREL 165 166 // R_ADDRPOWER_TOCREL relocates two D-form instructions like R_ADDRPOWER, but 167 // inserts the offset from the TOC to the address of the relocated symbol 168 // rather than the symbol's address. 169 R_ADDRPOWER_TOCREL 170 171 // R_ADDRPOWER_TOCREL relocates a D-form, DS-form instruction sequence like 172 // R_ADDRPOWER_DS but inserts the offset from the TOC to the address of the the 173 // relocated symbol rather than the symbol's address. 174 R_ADDRPOWER_TOCREL_DS 175 176 // R_PCRELDBL relocates s390x 2-byte aligned PC-relative addresses. 177 // TODO(mundaym): remove once variants can be serialized - see issue 14218. 178 R_PCRELDBL 179 180 // R_ADDRMIPSU (only used on mips/mips64) resolves to the sign-adjusted "upper" 16 181 // bits (bit 16-31) of an external address, by encoding it into the instruction. 182 R_ADDRMIPSU 183 // R_ADDRMIPSTLS (only used on mips64) resolves to the low 16 bits of a TLS 184 // address (offset from thread pointer), by encoding it into the instruction. 185 R_ADDRMIPSTLS 186 ) 187 188 // IsDirectJump returns whether r is a relocation for a direct jump. 189 // A direct jump is a CALL or JMP instruction that takes the target address 190 // as immediate. The address is embedded into the instruction, possibly 191 // with limited width. 192 // An indirect jump is a CALL or JMP instruction that takes the target address 193 // in register or memory. 194 func (r RelocType) IsDirectJump() bool { 195 switch r { 196 case R_CALL, R_CALLARM, R_CALLARM64, R_CALLPOWER, R_CALLMIPS, R_JMPMIPS: 197 return true 198 } 199 return false 200 }