Source file src/cmd/internal/objabi/reloctype.go
1 // Derived from Inferno utils/6l/l.h and related files. 2 // https://bitbucket.org/inferno-os/inferno-os/src/master/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 int16 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_SIZE 54 R_CALL 55 R_CALLARM 56 R_CALLARM64 57 R_CALLIND 58 R_CALLPOWER 59 // R_CALLMIPS (only used on mips64) resolves to non-PC-relative target address 60 // of a CALL (JAL) instruction, by encoding the address into the instruction. 61 R_CALLMIPS 62 R_CONST 63 R_PCREL 64 // R_TLS_LE, used on 386, amd64, and ARM, resolves to the offset of the 65 // thread-local symbol from the thread local base and is used to implement the 66 // "local exec" model for tls access (r.Sym is not set on intel platforms but is 67 // set to a TLS symbol -- runtime.tlsg -- in the linker when externally linking). 68 R_TLS_LE 69 // R_TLS_IE, used 386, amd64, and ARM resolves to the PC-relative offset to a GOT 70 // slot containing the offset from the thread-local symbol from the thread local 71 // base and is used to implemented the "initial exec" model for tls access (r.Sym 72 // is not set on intel platforms but is set to a TLS symbol -- runtime.tlsg -- in 73 // the linker when externally linking). 74 R_TLS_IE 75 R_GOTOFF 76 R_PLT0 77 R_PLT1 78 R_PLT2 79 R_USEFIELD 80 // R_USETYPE resolves to an *rtype, but no relocation is created. The 81 // linker uses this as a signal that the pointed-to type information 82 // should be linked into the final binary, even if there are no other 83 // direct references. (This is used for types reachable by reflection.) 84 R_USETYPE 85 // R_USEIFACE marks a type is converted to an interface in the function this 86 // relocation is applied to. The target is a type descriptor. 87 // This is a marker relocation (0-sized), for the linker's reachabililty 88 // analysis. 89 R_USEIFACE 90 // R_USEIFACEMETHOD marks an interface method that is used in the function 91 // this relocation is applied to. The target is an interface type descriptor. 92 // The addend is the offset of the method in the type descriptor. 93 // This is a marker relocation (0-sized), for the linker's reachabililty 94 // analysis. 95 R_USEIFACEMETHOD 96 // Similar to R_USEIFACEMETHOD, except instead of indicating a type + 97 // method offset with Sym+Add, Sym points to a symbol containing the name 98 // of the method being called. See the description in 99 // cmd/compile/internal/reflectdata/reflect.go:MarkUsedIfaceMethod for details. 100 R_USEGENERICIFACEMETHOD 101 // R_METHODOFF resolves to a 32-bit offset from the beginning of the section 102 // holding the data being relocated to the referenced symbol. 103 // It is a variant of R_ADDROFF used when linking from the uncommonType of a 104 // *rtype, and may be set to zero by the linker if it determines the method 105 // text is unreachable by the linked program. 106 R_METHODOFF 107 // R_KEEP tells the linker to keep the referred-to symbol in the final binary 108 // if the symbol containing the R_KEEP relocation is in the final binary. 109 R_KEEP 110 R_POWER_TOC 111 R_GOTPCREL 112 // R_JMPMIPS (only used on mips64) resolves to non-PC-relative target address 113 // of a JMP instruction, by encoding the address into the instruction. 114 // The stack nosplit check ignores this since it is not a function call. 115 R_JMPMIPS 116 117 // R_DWARFSECREF resolves to the offset of the symbol from its section. 118 // Target of relocation must be size 4 (in current implementation). 119 R_DWARFSECREF 120 121 // R_DWARFFILEREF resolves to an index into the DWARF .debug_line 122 // file table for the specified file symbol. Must be applied to an 123 // attribute of form DW_FORM_data4. 124 R_DWARFFILEREF 125 126 // Platform dependent relocations. Architectures with fixed width instructions 127 // have the inherent issue that a 32-bit (or 64-bit!) displacement cannot be 128 // stuffed into a 32-bit instruction, so an address needs to be spread across 129 // several instructions, and in turn this requires a sequence of relocations, each 130 // updating a part of an instruction. This leads to relocation codes that are 131 // inherently processor specific. 132 133 // Arm64. 134 135 // Set a MOV[NZ] immediate field to bits [15:0] of the offset from the thread 136 // local base to the thread local variable defined by the referenced (thread 137 // local) symbol. Error if the offset does not fit into 16 bits. 138 R_ARM64_TLS_LE 139 140 // Relocates an ADRP; LD64 instruction sequence to load the offset between 141 // the thread local base and the thread local variable defined by the 142 // referenced (thread local) symbol from the GOT. 143 R_ARM64_TLS_IE 144 145 // R_ARM64_GOTPCREL relocates an adrp, ld64 pair to compute the address of the GOT 146 // slot of the referenced symbol. 147 R_ARM64_GOTPCREL 148 149 // R_ARM64_GOT resolves a GOT-relative instruction sequence, usually an adrp 150 // followed by another ld instruction. 151 R_ARM64_GOT 152 153 // R_ARM64_PCREL resolves a PC-relative addresses instruction sequence, usually an 154 // adrp followed by another add instruction. 155 R_ARM64_PCREL 156 157 // R_ARM64_LDST8 sets a LD/ST immediate value to bits [11:0] of a local address. 158 R_ARM64_LDST8 159 160 // R_ARM64_LDST16 sets a LD/ST immediate value to bits [11:1] of a local address. 161 R_ARM64_LDST16 162 163 // R_ARM64_LDST32 sets a LD/ST immediate value to bits [11:2] of a local address. 164 R_ARM64_LDST32 165 166 // R_ARM64_LDST64 sets a LD/ST immediate value to bits [11:3] of a local address. 167 R_ARM64_LDST64 168 169 // R_ARM64_LDST128 sets a LD/ST immediate value to bits [11:4] of a local address. 170 R_ARM64_LDST128 171 172 // PPC64. 173 174 // R_POWER_TLS_LE is used to implement the "local exec" model for tls 175 // access. It resolves to the offset of the thread-local symbol from the 176 // thread pointer (R13) and is split against a pair of instructions to 177 // support a 32 bit displacement. 178 R_POWER_TLS_LE 179 180 // R_POWER_TLS_IE is used to implement the "initial exec" model for tls access. It 181 // relocates a D-form, DS-form instruction sequence like R_ADDRPOWER_DS. It 182 // inserts to the offset of GOT slot for the thread-local symbol from the TOC (the 183 // GOT slot is filled by the dynamic linker with the offset of the thread-local 184 // symbol from the thread pointer (R13)). 185 R_POWER_TLS_IE 186 187 // R_POWER_TLS marks an X-form instruction such as "ADD R3,R13,R4" as completing 188 // a sequence of GOT-relative relocations to compute a TLS address. This can be 189 // used by the system linker to to rewrite the GOT-relative TLS relocation into a 190 // simpler thread-pointer relative relocation. See table 3.26 and 3.28 in the 191 // ppc64 elfv2 1.4 ABI on this transformation. Likewise, the second argument 192 // (usually called RB in X-form instructions) is assumed to be R13. 193 R_POWER_TLS 194 195 // R_ADDRPOWER_DS is similar to R_ADDRPOWER above, but assumes the second 196 // instruction is a "DS-form" instruction, which has an immediate field occupying 197 // bits [15:2] of the instruction word. Bits [15:2] of the address of the 198 // relocated symbol are inserted into this field; it is an error if the last two 199 // bits of the address are not 0. 200 R_ADDRPOWER_DS 201 202 // R_ADDRPOWER_PCREL relocates a D-form, DS-form instruction sequence like 203 // R_ADDRPOWER_DS but inserts the offset of the GOT slot for the referenced symbol 204 // from the TOC rather than the symbol's address. 205 R_ADDRPOWER_GOT 206 207 // R_ADDRPOWER_PCREL relocates two D-form instructions like R_ADDRPOWER, but 208 // inserts the displacement from the place being relocated to the address of the 209 // relocated symbol instead of just its address. 210 R_ADDRPOWER_PCREL 211 212 // R_ADDRPOWER_TOCREL relocates two D-form instructions like R_ADDRPOWER, but 213 // inserts the offset from the TOC to the address of the relocated symbol 214 // rather than the symbol's address. 215 R_ADDRPOWER_TOCREL 216 217 // R_ADDRPOWER_TOCREL relocates a D-form, DS-form instruction sequence like 218 // R_ADDRPOWER_DS but inserts the offset from the TOC to the address of the 219 // relocated symbol rather than the symbol's address. 220 R_ADDRPOWER_TOCREL_DS 221 222 // RISC-V. 223 224 // R_RISCV_CALL relocates a J-type instruction with a 21 bit PC-relative 225 // address. 226 R_RISCV_CALL 227 228 // R_RISCV_CALL_TRAMP is the same as R_RISCV_CALL but denotes the use of a 229 // trampoline, which we may be able to avoid during relocation. These are 230 // only used by the linker and are not emitted by the compiler or assembler. 231 R_RISCV_CALL_TRAMP 232 233 // R_RISCV_PCREL_ITYPE resolves a 32-bit PC-relative address using an 234 // AUIPC + I-type instruction pair. 235 R_RISCV_PCREL_ITYPE 236 237 // R_RISCV_PCREL_STYPE resolves a 32-bit PC-relative address using an 238 // AUIPC + S-type instruction pair. 239 R_RISCV_PCREL_STYPE 240 241 // R_RISCV_TLS_IE_ITYPE resolves a 32-bit TLS initial-exec TOC offset 242 // address using an AUIPC + I-type instruction pair. 243 R_RISCV_TLS_IE_ITYPE 244 245 // R_RISCV_TLS_IE_STYPE resolves a 32-bit TLS initial-exec TOC offset 246 // address using an AUIPC + S-type instruction pair. 247 R_RISCV_TLS_IE_STYPE 248 249 // R_PCRELDBL relocates s390x 2-byte aligned PC-relative addresses. 250 // TODO(mundaym): remove once variants can be serialized - see issue 14218. 251 R_PCRELDBL 252 253 // R_ADDRMIPSU (only used on mips/mips64) resolves to the sign-adjusted "upper" 16 254 // bits (bit 16-31) of an external address, by encoding it into the instruction. 255 R_ADDRMIPSU 256 // R_ADDRMIPSTLS (only used on mips64) resolves to the low 16 bits of a TLS 257 // address (offset from thread pointer), by encoding it into the instruction. 258 R_ADDRMIPSTLS 259 260 // R_ADDRCUOFF resolves to a pointer-sized offset from the start of the 261 // symbol's DWARF compile unit. 262 R_ADDRCUOFF 263 264 // R_WASMIMPORT resolves to the index of the WebAssembly function import. 265 R_WASMIMPORT 266 267 // R_XCOFFREF (only used on aix/ppc64) prevents garbage collection by ld 268 // of a symbol. This isn't a real relocation, it can be placed in anywhere 269 // in a symbol and target any symbols. 270 R_XCOFFREF 271 272 // R_WEAK marks the relocation as a weak reference. 273 // A weak relocation does not make the symbol it refers to reachable, 274 // and is only honored by the linker if the symbol is in some other way 275 // reachable. 276 R_WEAK = -1 << 15 277 278 R_WEAKADDR = R_WEAK | R_ADDR 279 R_WEAKADDROFF = R_WEAK | R_ADDROFF 280 ) 281 282 // IsDirectCall reports whether r is a relocation for a direct call. 283 // A direct call is a CALL instruction that takes the target address 284 // as an immediate. The address is embedded into the instruction, possibly 285 // with limited width. An indirect call is a CALL instruction that takes 286 // the target address in register or memory. 287 func (r RelocType) IsDirectCall() bool { 288 switch r { 289 case R_CALL, R_CALLARM, R_CALLARM64, R_CALLMIPS, R_CALLPOWER, R_RISCV_CALL, R_RISCV_CALL_TRAMP: 290 return true 291 } 292 return false 293 } 294 295 // IsDirectJump reports whether r is a relocation for a direct jump. 296 // A direct jump is a JMP instruction that takes the target address 297 // as an immediate. The address is embedded into the instruction, possibly 298 // with limited width. An indirect jump is a JMP instruction that takes 299 // the target address in register or memory. 300 func (r RelocType) IsDirectJump() bool { 301 switch r { 302 case R_JMPMIPS: 303 return true 304 } 305 return false 306 } 307 308 // IsDirectCallOrJump reports whether r is a relocation for a direct 309 // call or a direct jump. 310 func (r RelocType) IsDirectCallOrJump() bool { 311 return r.IsDirectCall() || r.IsDirectJump() 312 } 313