1 //===- Relocations.cpp ----------------------------------------------------===// 2 // 3 // The LLVM Linker 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains platform-independent functions to process relocations. 11 // I'll describe the overview of this file here. 12 // 13 // Simple relocations are easy to handle for the linker. For example, 14 // for R_X86_64_PC64 relocs, the linker just has to fix up locations 15 // with the relative offsets to the target symbols. It would just be 16 // reading records from relocation sections and applying them to output. 17 // 18 // But not all relocations are that easy to handle. For example, for 19 // R_386_GOTOFF relocs, the linker has to create new GOT entries for 20 // symbols if they don't exist, and fix up locations with GOT entry 21 // offsets from the beginning of GOT section. So there is more than 22 // fixing addresses in relocation processing. 23 // 24 // ELF defines a large number of complex relocations. 25 // 26 // The functions in this file analyze relocations and do whatever needs 27 // to be done. It includes, but not limited to, the following. 28 // 29 // - create GOT/PLT entries 30 // - create new relocations in .dynsym to let the dynamic linker resolve 31 // them at runtime (since ELF supports dynamic linking, not all 32 // relocations can be resolved at link-time) 33 // - create COPY relocs and reserve space in .bss 34 // - replace expensive relocs (in terms of runtime cost) with cheap ones 35 // - error out infeasible combinations such as PIC and non-relative relocs 36 // 37 // Note that the functions in this file don't actually apply relocations 38 // because it doesn't know about the output file nor the output file buffer. 39 // It instead stores Relocation objects to InputSection's Relocations 40 // vector to let it apply later in InputSection::writeTo. 41 // 42 //===----------------------------------------------------------------------===// 43 44 #include "Relocations.h" 45 #include "Config.h" 46 #include "OutputSections.h" 47 #include "Strings.h" 48 #include "SymbolTable.h" 49 #include "SyntheticSections.h" 50 #include "Target.h" 51 #include "Thunks.h" 52 53 #include "llvm/Support/Endian.h" 54 #include "llvm/Support/raw_ostream.h" 55 56 using namespace llvm; 57 using namespace llvm::ELF; 58 using namespace llvm::object; 59 using namespace llvm::support::endian; 60 61 namespace lld { 62 namespace elf { 63 64 static bool refersToGotEntry(RelExpr Expr) { 65 return Expr == R_GOT || Expr == R_GOT_OFF || Expr == R_MIPS_GOT_LOCAL_PAGE || 66 Expr == R_MIPS_GOT_OFF || Expr == R_MIPS_GOT_OFF32 || 67 Expr == R_MIPS_TLSGD || Expr == R_MIPS_TLSLD || 68 Expr == R_GOT_PAGE_PC || Expr == R_GOT_PC || Expr == R_GOT_FROM_END || 69 Expr == R_TLSGD || Expr == R_TLSGD_PC || Expr == R_TLSDESC || 70 Expr == R_TLSDESC_PAGE; 71 } 72 73 static bool isPreemptible(const SymbolBody &Body, uint32_t Type) { 74 // In case of MIPS GP-relative relocations always resolve to a definition 75 // in a regular input file, ignoring the one-definition rule. So we, 76 // for example, should not attempt to create a dynamic relocation even 77 // if the target symbol is preemptible. There are two two MIPS GP-relative 78 // relocations R_MIPS_GPREL16 and R_MIPS_GPREL32. But only R_MIPS_GPREL16 79 // can be against a preemptible symbol. 80 // To get MIPS relocation type we apply 0xff mask. In case of O32 ABI all 81 // relocation types occupy eight bit. In case of N64 ABI we extract first 82 // relocation from 3-in-1 packet because only the first relocation can 83 // be against a real symbol. 84 if (Config->EMachine == EM_MIPS && (Type & 0xff) == R_MIPS_GPREL16) 85 return false; 86 return Body.isPreemptible(); 87 } 88 89 // This function is similar to the `handleTlsRelocation`. ARM and MIPS do not 90 // support any relaxations for TLS relocations so by factoring out ARM and MIPS 91 // handling in to the separate function we can simplify the code and do not 92 // pollute `handleTlsRelocation` by ARM and MIPS `ifs` statements. 93 // FIXME: The ARM implementation always adds the module index dynamic 94 // relocation even for non-preemptible symbols in applications. For static 95 // linking support we must either resolve the module index relocation at static 96 // link time, or hard code the module index (1) for the application in the GOT. 97 template <class ELFT, class GOT> 98 static unsigned handleNoRelaxTlsRelocation( 99 GOT *Got, uint32_t Type, SymbolBody &Body, InputSectionBase<ELFT> &C, 100 typename ELFT::uint Offset, typename ELFT::uint Addend, RelExpr Expr) { 101 if (Expr == R_MIPS_TLSLD || Expr == R_TLSLD_PC) { 102 if (Got->addTlsIndex() && (Config->Pic || Config->EMachine == EM_ARM)) 103 In<ELFT>::RelaDyn->addReloc({Target->TlsModuleIndexRel, Got, 104 Got->getTlsIndexOff(), false, nullptr, 0}); 105 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 106 return 1; 107 } 108 typedef typename ELFT::uint uintX_t; 109 if (Target->isTlsGlobalDynamicRel(Type)) { 110 if (Got->addDynTlsEntry(Body) && 111 (Body.isPreemptible() || Config->EMachine == EM_ARM)) { 112 uintX_t Off = Got->getGlobalDynOffset(Body); 113 In<ELFT>::RelaDyn->addReloc( 114 {Target->TlsModuleIndexRel, Got, Off, false, &Body, 0}); 115 if (Body.isPreemptible()) 116 In<ELFT>::RelaDyn->addReloc({Target->TlsOffsetRel, Got, 117 Off + (uintX_t)sizeof(uintX_t), false, 118 &Body, 0}); 119 } 120 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 121 return 1; 122 } 123 return 0; 124 } 125 126 // Returns the number of relocations processed. 127 template <class ELFT> 128 static unsigned handleTlsRelocation(uint32_t Type, SymbolBody &Body, 129 InputSectionBase<ELFT> &C, 130 typename ELFT::uint Offset, 131 typename ELFT::uint Addend, RelExpr Expr) { 132 if (!(C.Flags & SHF_ALLOC)) 133 return 0; 134 135 if (!Body.isTls()) 136 return 0; 137 138 typedef typename ELFT::uint uintX_t; 139 140 if (Config->EMachine == EM_ARM) 141 return handleNoRelaxTlsRelocation<ELFT>(In<ELFT>::Got, Type, Body, C, 142 Offset, Addend, Expr); 143 if (Config->EMachine == EM_MIPS) 144 return handleNoRelaxTlsRelocation<ELFT>(In<ELFT>::MipsGot, Type, Body, C, 145 Offset, Addend, Expr); 146 147 if ((Expr == R_TLSDESC || Expr == R_TLSDESC_PAGE || Expr == R_TLSDESC_CALL) && 148 Config->Shared) { 149 if (In<ELFT>::Got->addDynTlsEntry(Body)) { 150 uintX_t Off = In<ELFT>::Got->getGlobalDynOffset(Body); 151 In<ELFT>::RelaDyn->addReloc( 152 {Target->TlsDescRel, In<ELFT>::Got, Off, false, &Body, 0}); 153 } 154 if (Expr != R_TLSDESC_CALL) 155 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 156 return 1; 157 } 158 159 if (Expr == R_TLSLD_PC || Expr == R_TLSLD) { 160 // Local-Dynamic relocs can be relaxed to Local-Exec. 161 if (!Config->Shared) { 162 C.Relocations.push_back( 163 {R_RELAX_TLS_LD_TO_LE, Type, Offset, Addend, &Body}); 164 return 2; 165 } 166 if (In<ELFT>::Got->addTlsIndex()) 167 In<ELFT>::RelaDyn->addReloc({Target->TlsModuleIndexRel, In<ELFT>::Got, 168 In<ELFT>::Got->getTlsIndexOff(), false, 169 nullptr, 0}); 170 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 171 return 1; 172 } 173 174 // Local-Dynamic relocs can be relaxed to Local-Exec. 175 if (Target->isTlsLocalDynamicRel(Type) && !Config->Shared) { 176 C.Relocations.push_back( 177 {R_RELAX_TLS_LD_TO_LE, Type, Offset, Addend, &Body}); 178 return 1; 179 } 180 181 if (Expr == R_TLSDESC_PAGE || Expr == R_TLSDESC || Expr == R_TLSDESC_CALL || 182 Target->isTlsGlobalDynamicRel(Type)) { 183 if (Config->Shared) { 184 if (In<ELFT>::Got->addDynTlsEntry(Body)) { 185 uintX_t Off = In<ELFT>::Got->getGlobalDynOffset(Body); 186 In<ELFT>::RelaDyn->addReloc( 187 {Target->TlsModuleIndexRel, In<ELFT>::Got, Off, false, &Body, 0}); 188 189 // If the symbol is preemptible we need the dynamic linker to write 190 // the offset too. 191 if (isPreemptible(Body, Type)) 192 In<ELFT>::RelaDyn->addReloc({Target->TlsOffsetRel, In<ELFT>::Got, 193 Off + (uintX_t)sizeof(uintX_t), false, 194 &Body, 0}); 195 } 196 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 197 return 1; 198 } 199 200 // Global-Dynamic relocs can be relaxed to Initial-Exec or Local-Exec 201 // depending on the symbol being locally defined or not. 202 if (isPreemptible(Body, Type)) { 203 C.Relocations.push_back( 204 {Target->adjustRelaxExpr(Type, nullptr, R_RELAX_TLS_GD_TO_IE), Type, 205 Offset, Addend, &Body}); 206 if (!Body.isInGot()) { 207 In<ELFT>::Got->addEntry(Body); 208 In<ELFT>::RelaDyn->addReloc({Target->TlsGotRel, In<ELFT>::Got, 209 Body.getGotOffset<ELFT>(), false, &Body, 210 0}); 211 } 212 return Target->TlsGdRelaxSkip; 213 } 214 C.Relocations.push_back( 215 {Target->adjustRelaxExpr(Type, nullptr, R_RELAX_TLS_GD_TO_LE), Type, 216 Offset, Addend, &Body}); 217 return Target->TlsGdRelaxSkip; 218 } 219 220 // Initial-Exec relocs can be relaxed to Local-Exec if the symbol is locally 221 // defined. 222 if (Target->isTlsInitialExecRel(Type) && !Config->Shared && 223 !isPreemptible(Body, Type)) { 224 C.Relocations.push_back( 225 {R_RELAX_TLS_IE_TO_LE, Type, Offset, Addend, &Body}); 226 return 1; 227 } 228 return 0; 229 } 230 231 template <endianness E> static int16_t readSignedLo16(const uint8_t *Loc) { 232 return read32<E>(Loc) & 0xffff; 233 } 234 235 template <class RelTy> 236 static uint32_t getMipsPairType(const RelTy *Rel, const SymbolBody &Sym) { 237 switch (Rel->getType(Config->Mips64EL)) { 238 case R_MIPS_HI16: 239 return R_MIPS_LO16; 240 case R_MIPS_GOT16: 241 return Sym.isLocal() ? R_MIPS_LO16 : R_MIPS_NONE; 242 case R_MIPS_PCHI16: 243 return R_MIPS_PCLO16; 244 case R_MICROMIPS_HI16: 245 return R_MICROMIPS_LO16; 246 default: 247 return R_MIPS_NONE; 248 } 249 } 250 251 template <class ELFT, class RelTy> 252 static int32_t findMipsPairedAddend(const uint8_t *Buf, const uint8_t *BufLoc, 253 SymbolBody &Sym, const RelTy *Rel, 254 const RelTy *End) { 255 uint32_t SymIndex = Rel->getSymbol(Config->Mips64EL); 256 uint32_t Type = getMipsPairType(Rel, Sym); 257 258 // Some MIPS relocations use addend calculated from addend of the relocation 259 // itself and addend of paired relocation. ABI requires to compute such 260 // combined addend in case of REL relocation record format only. 261 // See p. 4-17 at ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 262 if (RelTy::IsRela || Type == R_MIPS_NONE) 263 return 0; 264 265 for (const RelTy *RI = Rel; RI != End; ++RI) { 266 if (RI->getType(Config->Mips64EL) != Type) 267 continue; 268 if (RI->getSymbol(Config->Mips64EL) != SymIndex) 269 continue; 270 const endianness E = ELFT::TargetEndianness; 271 return ((read32<E>(BufLoc) & 0xffff) << 16) + 272 readSignedLo16<E>(Buf + RI->r_offset); 273 } 274 warn("can't find matching " + toString(Type) + " relocation for " + 275 toString(Rel->getType(Config->Mips64EL))); 276 return 0; 277 } 278 279 // True if non-preemptable symbol always has the same value regardless of where 280 // the DSO is loaded. 281 template <class ELFT> static bool isAbsolute(const SymbolBody &Body) { 282 if (Body.isUndefined()) 283 return !Body.isLocal() && Body.symbol()->isWeak(); 284 if (const auto *DR = dyn_cast<DefinedRegular<ELFT>>(&Body)) 285 return DR->Section == nullptr; // Absolute symbol. 286 return false; 287 } 288 289 template <class ELFT> static bool isAbsoluteValue(const SymbolBody &Body) { 290 return isAbsolute<ELFT>(Body) || Body.isTls(); 291 } 292 293 static bool needsPlt(RelExpr Expr) { 294 return Expr == R_PLT_PC || Expr == R_PPC_PLT_OPD || Expr == R_PLT || 295 Expr == R_PLT_PAGE_PC || Expr == R_THUNK_PLT_PC; 296 } 297 298 // True if this expression is of the form Sym - X, where X is a position in the 299 // file (PC, or GOT for example). 300 static bool isRelExpr(RelExpr Expr) { 301 return Expr == R_PC || Expr == R_GOTREL || Expr == R_GOTREL_FROM_END || 302 Expr == R_MIPS_GOTREL || Expr == R_PAGE_PC || Expr == R_RELAX_GOT_PC || 303 Expr == R_THUNK_PC || Expr == R_THUNK_PLT_PC; 304 } 305 306 template <class ELFT> 307 static bool isStaticLinkTimeConstant(RelExpr E, uint32_t Type, 308 const SymbolBody &Body, 309 InputSectionBase<ELFT> &S, 310 typename ELFT::uint RelOff) { 311 // These expressions always compute a constant 312 if (E == R_SIZE || E == R_GOT_FROM_END || E == R_GOT_OFF || 313 E == R_MIPS_GOT_LOCAL_PAGE || E == R_MIPS_GOT_OFF || 314 E == R_MIPS_GOT_OFF32 || E == R_MIPS_TLSGD || E == R_GOT_PAGE_PC || 315 E == R_GOT_PC || E == R_PLT_PC || E == R_TLSGD_PC || E == R_TLSGD || 316 E == R_PPC_PLT_OPD || E == R_TLSDESC_CALL || E == R_TLSDESC_PAGE || 317 E == R_HINT || E == R_THUNK_PC || E == R_THUNK_PLT_PC) 318 return true; 319 320 // These never do, except if the entire file is position dependent or if 321 // only the low bits are used. 322 if (E == R_GOT || E == R_PLT || E == R_TLSDESC) 323 return Target->usesOnlyLowPageBits(Type) || !Config->Pic; 324 325 if (isPreemptible(Body, Type)) 326 return false; 327 328 if (!Config->Pic) 329 return true; 330 331 bool AbsVal = isAbsoluteValue<ELFT>(Body); 332 bool RelE = isRelExpr(E); 333 if (AbsVal && !RelE) 334 return true; 335 if (!AbsVal && RelE) 336 return true; 337 338 // Relative relocation to an absolute value. This is normally unrepresentable, 339 // but if the relocation refers to a weak undefined symbol, we allow it to 340 // resolve to the image base. This is a little strange, but it allows us to 341 // link function calls to such symbols. Normally such a call will be guarded 342 // with a comparison, which will load a zero from the GOT. 343 if (AbsVal && RelE) { 344 if (Body.isUndefined() && !Body.isLocal() && Body.symbol()->isWeak()) 345 return true; 346 error(getLocation(S, RelOff) + ": relocation " + toString(Type) + 347 " cannot refer to absolute symbol '" + Body.getName() + 348 "' defined in " + toString(Body.File)); 349 return true; 350 } 351 352 return Target->usesOnlyLowPageBits(Type); 353 } 354 355 static RelExpr toPlt(RelExpr Expr) { 356 if (Expr == R_PPC_OPD) 357 return R_PPC_PLT_OPD; 358 if (Expr == R_PC) 359 return R_PLT_PC; 360 if (Expr == R_PAGE_PC) 361 return R_PLT_PAGE_PC; 362 if (Expr == R_ABS) 363 return R_PLT; 364 return Expr; 365 } 366 367 static RelExpr fromPlt(RelExpr Expr) { 368 // We decided not to use a plt. Optimize a reference to the plt to a 369 // reference to the symbol itself. 370 if (Expr == R_PLT_PC) 371 return R_PC; 372 if (Expr == R_PPC_PLT_OPD) 373 return R_PPC_OPD; 374 if (Expr == R_PLT) 375 return R_ABS; 376 return Expr; 377 } 378 379 template <class ELFT> static uint32_t getAlignment(SharedSymbol<ELFT> *SS) { 380 typedef typename ELFT::uint uintX_t; 381 382 uintX_t SecAlign = SS->file()->getSection(SS->Sym)->sh_addralign; 383 uintX_t SymValue = SS->Sym.st_value; 384 int TrailingZeros = 385 std::min(countTrailingZeros(SecAlign), countTrailingZeros(SymValue)); 386 return 1 << TrailingZeros; 387 } 388 389 // Reserve space in .bss for copy relocation. 390 template <class ELFT> static void addCopyRelSymbol(SharedSymbol<ELFT> *SS) { 391 typedef typename ELFT::uint uintX_t; 392 typedef typename ELFT::Sym Elf_Sym; 393 394 // Copy relocation against zero-sized symbol doesn't make sense. 395 uintX_t SymSize = SS->template getSize<ELFT>(); 396 if (SymSize == 0) 397 fatal("cannot create a copy relocation for symbol " + SS->getName()); 398 399 uintX_t Alignment = getAlignment(SS); 400 uintX_t Off = alignTo(Out<ELFT>::Bss->Size, Alignment); 401 Out<ELFT>::Bss->Size = Off + SymSize; 402 Out<ELFT>::Bss->updateAlignment(Alignment); 403 uintX_t Shndx = SS->Sym.st_shndx; 404 uintX_t Value = SS->Sym.st_value; 405 // Look through the DSO's dynamic symbol table for aliases and create a 406 // dynamic symbol for each one. This causes the copy relocation to correctly 407 // interpose any aliases. 408 for (const Elf_Sym &S : SS->file()->getGlobalSymbols()) { 409 if (S.st_shndx != Shndx || S.st_value != Value) 410 continue; 411 auto *Alias = dyn_cast_or_null<SharedSymbol<ELFT>>( 412 Symtab<ELFT>::X->find(check(S.getName(SS->file()->getStringTable())))); 413 if (!Alias) 414 continue; 415 Alias->OffsetInBss = Off; 416 Alias->NeedsCopyOrPltAddr = true; 417 Alias->symbol()->IsUsedInRegularObj = true; 418 } 419 In<ELFT>::RelaDyn->addReloc( 420 {Target->CopyRel, Out<ELFT>::Bss, SS->OffsetInBss, false, SS, 0}); 421 } 422 423 template <class ELFT> 424 static RelExpr adjustExpr(const elf::ObjectFile<ELFT> &File, SymbolBody &Body, 425 bool IsWrite, RelExpr Expr, uint32_t Type, 426 const uint8_t *Data, InputSectionBase<ELFT> &S, 427 typename ELFT::uint RelOff) { 428 bool Preemptible = isPreemptible(Body, Type); 429 if (Body.isGnuIFunc()) { 430 Expr = toPlt(Expr); 431 } else if (!Preemptible) { 432 if (needsPlt(Expr)) 433 Expr = fromPlt(Expr); 434 if (Expr == R_GOT_PC && !isAbsoluteValue<ELFT>(Body)) 435 Expr = Target->adjustRelaxExpr(Type, Data, Expr); 436 } 437 Expr = Target->getThunkExpr(Expr, Type, File, Body); 438 439 if (IsWrite || isStaticLinkTimeConstant<ELFT>(Expr, Type, Body, S, RelOff)) 440 return Expr; 441 442 // This relocation would require the dynamic linker to write a value to read 443 // only memory. We can hack around it if we are producing an executable and 444 // the refered symbol can be preemepted to refer to the executable. 445 if (Config->Shared || (Config->Pic && !isRelExpr(Expr))) { 446 StringRef Name = Body.getName(); 447 error(getLocation(S, RelOff) + ": can't create dynamic relocation " + 448 toString(Type) + " against " + 449 ((Name.empty() ? "local symbol in readonly segment" 450 : "symbol '" + Name + "'")) + 451 " defined in " + toString(Body.File)); 452 return Expr; 453 } 454 if (Body.getVisibility() != STV_DEFAULT) { 455 error(getLocation(S, RelOff) + ": cannot preempt symbol '" + 456 Body.getName() + "' defined in " + toString(Body.File)); 457 return Expr; 458 } 459 if (Body.isObject()) { 460 // Produce a copy relocation. 461 auto *B = cast<SharedSymbol<ELFT>>(&Body); 462 if (!B->needsCopy()) 463 addCopyRelSymbol(B); 464 return Expr; 465 } 466 if (Body.isFunc()) { 467 // This handles a non PIC program call to function in a shared library. In 468 // an ideal world, we could just report an error saying the relocation can 469 // overflow at runtime. In the real world with glibc, crt1.o has a 470 // R_X86_64_PC32 pointing to libc.so. 471 // 472 // The general idea on how to handle such cases is to create a PLT entry and 473 // use that as the function value. 474 // 475 // For the static linking part, we just return a plt expr and everything 476 // else will use the the PLT entry as the address. 477 // 478 // The remaining problem is making sure pointer equality still works. We 479 // need the help of the dynamic linker for that. We let it know that we have 480 // a direct reference to a so symbol by creating an undefined symbol with a 481 // non zero st_value. Seeing that, the dynamic linker resolves the symbol to 482 // the value of the symbol we created. This is true even for got entries, so 483 // pointer equality is maintained. To avoid an infinite loop, the only entry 484 // that points to the real function is a dedicated got entry used by the 485 // plt. That is identified by special relocation types (R_X86_64_JUMP_SLOT, 486 // R_386_JMP_SLOT, etc). 487 Body.NeedsCopyOrPltAddr = true; 488 return toPlt(Expr); 489 } 490 error("symbol '" + Body.getName() + "' defined in " + toString(Body.File) + 491 " is missing type"); 492 493 return Expr; 494 } 495 496 template <class ELFT, class RelTy> 497 static typename ELFT::uint computeAddend(const elf::ObjectFile<ELFT> &File, 498 const uint8_t *SectionData, 499 const RelTy *End, const RelTy &RI, 500 RelExpr Expr, SymbolBody &Body) { 501 typedef typename ELFT::uint uintX_t; 502 503 uint32_t Type = RI.getType(Config->Mips64EL); 504 uintX_t Addend = getAddend<ELFT>(RI); 505 const uint8_t *BufLoc = SectionData + RI.r_offset; 506 if (!RelTy::IsRela) 507 Addend += Target->getImplicitAddend(BufLoc, Type); 508 if (Config->EMachine == EM_MIPS) { 509 Addend += findMipsPairedAddend<ELFT>(SectionData, BufLoc, Body, &RI, End); 510 if (Type == R_MIPS_LO16 && Expr == R_PC) 511 // R_MIPS_LO16 expression has R_PC type iif the target is _gp_disp 512 // symbol. In that case we should use the following formula for 513 // calculation "AHL + GP - P + 4". Let's add 4 right here. 514 // For details see p. 4-19 at 515 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 516 Addend += 4; 517 if (Expr == R_MIPS_GOTREL && Body.isLocal()) 518 Addend += File.MipsGp0; 519 } 520 if (Config->Pic && Config->EMachine == EM_PPC64 && Type == R_PPC64_TOC) 521 Addend += getPPC64TocBase(); 522 return Addend; 523 } 524 525 // Find symbol that encloses given offset. Used for error reporting. 526 template <class ELFT> 527 static DefinedRegular<ELFT> *getSymbolAt(InputSectionBase<ELFT> *S, 528 typename ELFT::uint Offset) { 529 for (SymbolBody *B : S->getFile()->getSymbols()) 530 if (auto *D = dyn_cast<DefinedRegular<ELFT>>(B)) 531 if (D->Value <= Offset && D->Value + D->Size > Offset && D->Section == S) 532 return D; 533 534 return nullptr; 535 } 536 537 template <class ELFT> 538 std::string getLocation(InputSectionBase<ELFT> &S, typename ELFT::uint Offset) { 539 ObjectFile<ELFT> *File = S.getFile(); 540 541 // First check if we can get desired values from debugging information. 542 std::string LineInfo = File->getLineInfo(&S, Offset); 543 if (!LineInfo.empty()) 544 return LineInfo; 545 546 // File->SourceFile contains STT_FILE symbol contents which is a 547 // filename. Compilers usually create STT_FILE symbols. If it's 548 // missing, we use an actual filename. 549 std::string SrcFile = File->SourceFile; 550 if (SrcFile.empty()) 551 SrcFile = toString(File); 552 553 // Find a symbol at a given location. 554 DefinedRegular<ELFT> *Encl = getSymbolAt(&S, Offset); 555 if (Encl && Encl->Type == STT_FUNC) 556 return SrcFile + ":(function " + maybeDemangle(Encl->getName()) + ")"; 557 558 // If there's no symbol, print out the offset instead of a symbol name. 559 return (SrcFile + ":(" + S.Name + "+0x" + utohexstr(Offset) + ")").str(); 560 } 561 562 template <class ELFT> 563 static void reportUndefined(SymbolBody &Sym, InputSectionBase<ELFT> &S, 564 typename ELFT::uint Offset) { 565 if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore) 566 return; 567 568 if (Config->Shared && Sym.symbol()->Visibility == STV_DEFAULT && 569 Config->UnresolvedSymbols != UnresolvedPolicy::NoUndef) 570 return; 571 572 std::string Msg = getLocation(S, Offset) + ": undefined symbol '" + 573 maybeDemangle(Sym.getName()) + "'"; 574 575 if (Config->UnresolvedSymbols == UnresolvedPolicy::Warn) 576 warn(Msg); 577 else 578 error(Msg); 579 } 580 581 template <class RelTy> 582 static std::pair<uint32_t, uint32_t> 583 mergeMipsN32RelTypes(uint32_t Type, uint32_t Offset, RelTy *I, RelTy *E) { 584 // MIPS N32 ABI treats series of successive relocations with the same offset 585 // as a single relocation. The similar approach used by N64 ABI, but this ABI 586 // packs all relocations into the single relocation record. Here we emulate 587 // this for the N32 ABI. Iterate over relocation with the same offset and put 588 // theirs types into the single bit-set. 589 uint32_t Processed = 0; 590 for (; I != E && Offset == I->r_offset; ++I) { 591 ++Processed; 592 Type |= I->getType(Config->Mips64EL) << (8 * Processed); 593 } 594 return std::make_pair(Type, Processed); 595 } 596 597 // The reason we have to do this early scan is as follows 598 // * To mmap the output file, we need to know the size 599 // * For that, we need to know how many dynamic relocs we will have. 600 // It might be possible to avoid this by outputting the file with write: 601 // * Write the allocated output sections, computing addresses. 602 // * Apply relocations, recording which ones require a dynamic reloc. 603 // * Write the dynamic relocations. 604 // * Write the rest of the file. 605 // This would have some drawbacks. For example, we would only know if .rela.dyn 606 // is needed after applying relocations. If it is, it will go after rw and rx 607 // sections. Given that it is ro, we will need an extra PT_LOAD. This 608 // complicates things for the dynamic linker and means we would have to reserve 609 // space for the extra PT_LOAD even if we end up not using it. 610 template <class ELFT, class RelTy> 611 static void scanRelocs(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) { 612 typedef typename ELFT::uint uintX_t; 613 614 bool IsWrite = C.Flags & SHF_WRITE; 615 616 auto AddDyn = [=](const DynamicReloc<ELFT> &Reloc) { 617 In<ELFT>::RelaDyn->addReloc(Reloc); 618 }; 619 620 const elf::ObjectFile<ELFT> *File = C.getFile(); 621 ArrayRef<uint8_t> SectionData = C.Data; 622 const uint8_t *Buf = SectionData.begin(); 623 624 ArrayRef<EhSectionPiece> Pieces; 625 if (auto *Eh = dyn_cast<EhInputSection<ELFT>>(&C)) 626 Pieces = Eh->Pieces; 627 628 ArrayRef<EhSectionPiece>::iterator PieceI = Pieces.begin(); 629 ArrayRef<EhSectionPiece>::iterator PieceE = Pieces.end(); 630 631 for (auto I = Rels.begin(), E = Rels.end(); I != E; ++I) { 632 const RelTy &RI = *I; 633 SymbolBody &Body = File->getRelocTargetSym(RI); 634 uint32_t Type = RI.getType(Config->Mips64EL); 635 636 if (Config->MipsN32Abi) { 637 uint32_t Processed; 638 std::tie(Type, Processed) = 639 mergeMipsN32RelTypes(Type, RI.r_offset, I + 1, E); 640 I += Processed; 641 } 642 643 // We only report undefined symbols if they are referenced somewhere in the 644 // code. 645 if (!Body.isLocal() && Body.isUndefined() && !Body.symbol()->isWeak()) 646 reportUndefined(Body, C, RI.r_offset); 647 648 RelExpr Expr = Target->getRelExpr(Type, Body); 649 bool Preemptible = isPreemptible(Body, Type); 650 Expr = adjustExpr(*File, Body, IsWrite, Expr, Type, Buf + RI.r_offset, C, 651 RI.r_offset); 652 if (ErrorCount) 653 continue; 654 655 // Skip a relocation that points to a dead piece 656 // in a eh_frame section. 657 while (PieceI != PieceE && 658 (PieceI->InputOff + PieceI->size() <= RI.r_offset)) 659 ++PieceI; 660 661 // Compute the offset of this section in the output section. We do it here 662 // to try to compute it only once. 663 uintX_t Offset; 664 if (PieceI != PieceE) { 665 assert(PieceI->InputOff <= RI.r_offset && "Relocation not in any piece"); 666 if (PieceI->OutputOff == -1) 667 continue; 668 Offset = PieceI->OutputOff + RI.r_offset - PieceI->InputOff; 669 } else { 670 Offset = RI.r_offset; 671 } 672 673 // This relocation does not require got entry, but it is relative to got and 674 // needs it to be created. Here we request for that. 675 if (Expr == R_GOTONLY_PC || Expr == R_GOTONLY_PC_FROM_END || 676 Expr == R_GOTREL || Expr == R_GOTREL_FROM_END || Expr == R_PPC_TOC) 677 In<ELFT>::Got->HasGotOffRel = true; 678 679 uintX_t Addend = computeAddend(*File, Buf, E, RI, Expr, Body); 680 681 if (unsigned Processed = 682 handleTlsRelocation<ELFT>(Type, Body, C, Offset, Addend, Expr)) { 683 I += (Processed - 1); 684 continue; 685 } 686 687 // Ignore "hint" and TLS Descriptor call relocation because they are 688 // only markers for relaxation. 689 if (Expr == R_HINT || Expr == R_TLSDESC_CALL) 690 continue; 691 692 if (needsPlt(Expr) || Expr == R_THUNK_ABS || Expr == R_THUNK_PC || 693 Expr == R_THUNK_PLT_PC || refersToGotEntry(Expr) || 694 !isPreemptible(Body, Type)) { 695 // If the relocation points to something in the file, we can process it. 696 bool Constant = 697 isStaticLinkTimeConstant<ELFT>(Expr, Type, Body, C, RI.r_offset); 698 699 // If the output being produced is position independent, the final value 700 // is still not known. In that case we still need some help from the 701 // dynamic linker. We can however do better than just copying the incoming 702 // relocation. We can process some of it and and just ask the dynamic 703 // linker to add the load address. 704 if (!Constant) 705 AddDyn({Target->RelativeRel, &C, Offset, true, &Body, Addend}); 706 707 // If the produced value is a constant, we just remember to write it 708 // when outputting this section. We also have to do it if the format 709 // uses Elf_Rel, since in that case the written value is the addend. 710 if (Constant || !RelTy::IsRela) 711 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 712 } else { 713 // We don't know anything about the finaly symbol. Just ask the dynamic 714 // linker to handle the relocation for us. 715 AddDyn({Target->getDynRel(Type), &C, Offset, false, &Body, Addend}); 716 // MIPS ABI turns using of GOT and dynamic relocations inside out. 717 // While regular ABI uses dynamic relocations to fill up GOT entries 718 // MIPS ABI requires dynamic linker to fills up GOT entries using 719 // specially sorted dynamic symbol table. This affects even dynamic 720 // relocations against symbols which do not require GOT entries 721 // creation explicitly, i.e. do not have any GOT-relocations. So if 722 // a preemptible symbol has a dynamic relocation we anyway have 723 // to create a GOT entry for it. 724 // If a non-preemptible symbol has a dynamic relocation against it, 725 // dynamic linker takes it st_value, adds offset and writes down 726 // result of the dynamic relocation. In case of preemptible symbol 727 // dynamic linker performs symbol resolution, writes the symbol value 728 // to the GOT entry and reads the GOT entry when it needs to perform 729 // a dynamic relocation. 730 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf p.4-19 731 if (Config->EMachine == EM_MIPS) 732 In<ELFT>::MipsGot->addEntry(Body, Addend, Expr); 733 continue; 734 } 735 736 // At this point we are done with the relocated position. Some relocations 737 // also require us to create a got or plt entry. 738 739 // If a relocation needs PLT, we create a PLT and a GOT slot for the symbol. 740 if (needsPlt(Expr)) { 741 if (Body.isInPlt()) 742 continue; 743 In<ELFT>::Plt->addEntry(Body); 744 745 uint32_t Rel; 746 if (Body.isGnuIFunc() && !Preemptible) 747 Rel = Target->IRelativeRel; 748 else 749 Rel = Target->PltRel; 750 751 In<ELFT>::GotPlt->addEntry(Body); 752 In<ELFT>::RelaPlt->addReloc({Rel, In<ELFT>::GotPlt, 753 Body.getGotPltOffset<ELFT>(), !Preemptible, 754 &Body, 0}); 755 continue; 756 } 757 758 if (refersToGotEntry(Expr)) { 759 if (Config->EMachine == EM_MIPS) { 760 // MIPS ABI has special rules to process GOT entries and doesn't 761 // require relocation entries for them. A special case is TLS 762 // relocations. In that case dynamic loader applies dynamic 763 // relocations to initialize TLS GOT entries. 764 // See "Global Offset Table" in Chapter 5 in the following document 765 // for detailed description: 766 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 767 In<ELFT>::MipsGot->addEntry(Body, Addend, Expr); 768 if (Body.isTls() && Body.isPreemptible()) 769 AddDyn({Target->TlsGotRel, In<ELFT>::MipsGot, 770 Body.getGotOffset<ELFT>(), false, &Body, 0}); 771 continue; 772 } 773 774 if (Body.isInGot()) 775 continue; 776 777 In<ELFT>::Got->addEntry(Body); 778 if (Preemptible || (Config->Pic && !isAbsolute<ELFT>(Body))) { 779 uint32_t DynType; 780 if (Body.isTls()) 781 DynType = Target->TlsGotRel; 782 else if (Preemptible) 783 DynType = Target->GotRel; 784 else 785 DynType = Target->RelativeRel; 786 AddDyn({DynType, In<ELFT>::Got, Body.getGotOffset<ELFT>(), !Preemptible, 787 &Body, 0}); 788 } 789 continue; 790 } 791 } 792 } 793 794 template <class ELFT> void scanRelocations(InputSectionBase<ELFT> &S) { 795 if (S.AreRelocsRela) 796 scanRelocs(S, S.relas()); 797 else 798 scanRelocs(S, S.rels()); 799 } 800 801 template <class ELFT, class RelTy> 802 static void createThunks(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) { 803 const elf::ObjectFile<ELFT> *File = C.getFile(); 804 for (const RelTy &Rel : Rels) { 805 SymbolBody &Body = File->getRelocTargetSym(Rel); 806 uint32_t Type = Rel.getType(Config->Mips64EL); 807 RelExpr Expr = Target->getRelExpr(Type, Body); 808 if (!isPreemptible(Body, Type) && needsPlt(Expr)) 809 Expr = fromPlt(Expr); 810 Expr = Target->getThunkExpr(Expr, Type, *File, Body); 811 // Some targets might require creation of thunks for relocations. 812 // Now we support only MIPS which requires LA25 thunk to call PIC 813 // code from non-PIC one, and ARM which requires interworking. 814 if (Expr == R_THUNK_ABS || Expr == R_THUNK_PC || Expr == R_THUNK_PLT_PC) { 815 auto *Sec = cast<InputSection<ELFT>>(&C); 816 addThunk<ELFT>(Type, Body, *Sec); 817 } 818 } 819 } 820 821 template <class ELFT> void createThunks(InputSectionBase<ELFT> &S) { 822 if (S.AreRelocsRela) 823 createThunks(S, S.relas()); 824 else 825 createThunks(S, S.rels()); 826 } 827 828 template void scanRelocations<ELF32LE>(InputSectionBase<ELF32LE> &); 829 template void scanRelocations<ELF32BE>(InputSectionBase<ELF32BE> &); 830 template void scanRelocations<ELF64LE>(InputSectionBase<ELF64LE> &); 831 template void scanRelocations<ELF64BE>(InputSectionBase<ELF64BE> &); 832 833 template void createThunks<ELF32LE>(InputSectionBase<ELF32LE> &); 834 template void createThunks<ELF32BE>(InputSectionBase<ELF32BE> &); 835 template void createThunks<ELF64LE>(InputSectionBase<ELF64LE> &); 836 template void createThunks<ELF64BE>(InputSectionBase<ELF64BE> &); 837 838 template std::string getLocation<ELF32LE>(InputSectionBase<ELF32LE> &S, 839 uint32_t Offset); 840 template std::string getLocation<ELF32BE>(InputSectionBase<ELF32BE> &S, 841 uint32_t Offset); 842 template std::string getLocation<ELF64LE>(InputSectionBase<ELF64LE> &S, 843 uint64_t Offset); 844 template std::string getLocation<ELF64BE>(InputSectionBase<ELF64BE> &S, 845 uint64_t Offset); 846 } 847 } 848