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 "Memory.h" 47 #include "OutputSections.h" 48 #include "Strings.h" 49 #include "SymbolTable.h" 50 #include "SyntheticSections.h" 51 #include "Target.h" 52 #include "Thunks.h" 53 54 #include "llvm/Support/Endian.h" 55 #include "llvm/Support/raw_ostream.h" 56 #include <algorithm> 57 58 using namespace llvm; 59 using namespace llvm::ELF; 60 using namespace llvm::object; 61 using namespace llvm::support::endian; 62 63 namespace lld { 64 namespace elf { 65 66 static bool refersToGotEntry(RelExpr Expr) { 67 return isRelExprOneOf<R_GOT, R_GOT_OFF, R_MIPS_GOT_LOCAL_PAGE, R_MIPS_GOT_OFF, 68 R_MIPS_GOT_OFF32, R_MIPS_TLSGD, R_MIPS_TLSLD, 69 R_GOT_PAGE_PC, R_GOT_PC, R_GOT_FROM_END, R_TLSGD, 70 R_TLSGD_PC, R_TLSDESC, R_TLSDESC_PAGE>(Expr); 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 template <class ELFT, class GOT> 94 static unsigned 95 handleNoRelaxTlsRelocation(GOT *Got, uint32_t Type, SymbolBody &Body, 96 InputSectionBase &C, typename ELFT::uint Offset, 97 int64_t Addend, RelExpr Expr) { 98 typedef typename ELFT::uint uintX_t; 99 auto addModuleReloc = [](SymbolBody &Body, GOT *Got, uintX_t Off, bool LD) { 100 // The Dynamic TLS Module Index Relocation can be statically resolved to 1 101 // if we know that we are linking an executable. For ARM we resolve the 102 // relocation when writing the Got. MIPS has a custom Got implementation 103 // that writes the Module index in directly. 104 if (!Body.isPreemptible() && !Config->pic() && Config->EMachine == EM_ARM) 105 Got->Relocations.push_back( 106 {R_ABS, Target->TlsModuleIndexRel, Off, 0, &Body}); 107 else { 108 SymbolBody *Dest = LD ? nullptr : &Body; 109 In<ELFT>::RelaDyn->addReloc( 110 {Target->TlsModuleIndexRel, Got, Off, false, Dest, 0}); 111 } 112 }; 113 if (isRelExprOneOf<R_MIPS_TLSLD, R_TLSLD_PC>(Expr)) { 114 if (Got->addTlsIndex() && (Config->pic() || Config->EMachine == EM_ARM)) 115 addModuleReloc(Body, Got, Got->getTlsIndexOff(), true); 116 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 117 return 1; 118 } 119 if (Target->isTlsGlobalDynamicRel(Type)) { 120 if (Got->addDynTlsEntry(Body) && 121 (Body.isPreemptible() || Config->EMachine == EM_ARM)) { 122 uintX_t Off = Got->getGlobalDynOffset(Body); 123 addModuleReloc(Body, Got, Off, false); 124 if (Body.isPreemptible()) 125 In<ELFT>::RelaDyn->addReloc({Target->TlsOffsetRel, Got, 126 Off + (uintX_t)sizeof(uintX_t), false, 127 &Body, 0}); 128 } 129 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 130 return 1; 131 } 132 return 0; 133 } 134 135 // Returns the number of relocations processed. 136 template <class ELFT> 137 static unsigned 138 handleTlsRelocation(uint32_t Type, SymbolBody &Body, InputSectionBase &C, 139 typename ELFT::uint Offset, int64_t Addend, RelExpr Expr) { 140 if (!(C.Flags & SHF_ALLOC)) 141 return 0; 142 143 if (!Body.isTls()) 144 return 0; 145 146 typedef typename ELFT::uint uintX_t; 147 148 if (Config->EMachine == EM_ARM) 149 return handleNoRelaxTlsRelocation<ELFT>(In<ELFT>::Got, Type, Body, C, 150 Offset, Addend, Expr); 151 if (Config->EMachine == EM_MIPS) 152 return handleNoRelaxTlsRelocation<ELFT>(In<ELFT>::MipsGot, Type, Body, C, 153 Offset, Addend, Expr); 154 155 bool IsPreemptible = isPreemptible(Body, Type); 156 if (isRelExprOneOf<R_TLSDESC, R_TLSDESC_PAGE, R_TLSDESC_CALL>(Expr) && 157 Config->Shared) { 158 if (In<ELFT>::Got->addDynTlsEntry(Body)) { 159 uintX_t Off = In<ELFT>::Got->getGlobalDynOffset(Body); 160 In<ELFT>::RelaDyn->addReloc({Target->TlsDescRel, In<ELFT>::Got, Off, 161 !IsPreemptible, &Body, 0}); 162 } 163 if (Expr != R_TLSDESC_CALL) 164 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 165 return 1; 166 } 167 168 if (isRelExprOneOf<R_TLSLD_PC, R_TLSLD>(Expr)) { 169 // Local-Dynamic relocs can be relaxed to Local-Exec. 170 if (!Config->Shared) { 171 C.Relocations.push_back( 172 {R_RELAX_TLS_LD_TO_LE, Type, Offset, Addend, &Body}); 173 return 2; 174 } 175 if (In<ELFT>::Got->addTlsIndex()) 176 In<ELFT>::RelaDyn->addReloc({Target->TlsModuleIndexRel, In<ELFT>::Got, 177 In<ELFT>::Got->getTlsIndexOff(), false, 178 nullptr, 0}); 179 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 180 return 1; 181 } 182 183 // Local-Dynamic relocs can be relaxed to Local-Exec. 184 if (Target->isTlsLocalDynamicRel(Type) && !Config->Shared) { 185 C.Relocations.push_back( 186 {R_RELAX_TLS_LD_TO_LE, Type, Offset, Addend, &Body}); 187 return 1; 188 } 189 190 if (isRelExprOneOf<R_TLSDESC_PAGE, R_TLSDESC, R_TLSDESC_CALL>(Expr) || 191 Target->isTlsGlobalDynamicRel(Type)) { 192 if (Config->Shared) { 193 if (In<ELFT>::Got->addDynTlsEntry(Body)) { 194 uintX_t Off = In<ELFT>::Got->getGlobalDynOffset(Body); 195 In<ELFT>::RelaDyn->addReloc( 196 {Target->TlsModuleIndexRel, In<ELFT>::Got, Off, false, &Body, 0}); 197 198 // If the symbol is preemptible we need the dynamic linker to write 199 // the offset too. 200 uintX_t OffsetOff = Off + (uintX_t)sizeof(uintX_t); 201 if (IsPreemptible) 202 In<ELFT>::RelaDyn->addReloc({Target->TlsOffsetRel, In<ELFT>::Got, 203 OffsetOff, false, &Body, 0}); 204 else 205 In<ELFT>::Got->Relocations.push_back( 206 {R_ABS, Target->TlsOffsetRel, OffsetOff, 0, &Body}); 207 } 208 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 209 return 1; 210 } 211 212 // Global-Dynamic relocs can be relaxed to Initial-Exec or Local-Exec 213 // depending on the symbol being locally defined or not. 214 if (IsPreemptible) { 215 C.Relocations.push_back( 216 {Target->adjustRelaxExpr(Type, nullptr, R_RELAX_TLS_GD_TO_IE), Type, 217 Offset, Addend, &Body}); 218 if (!Body.isInGot()) { 219 In<ELFT>::Got->addEntry(Body); 220 In<ELFT>::RelaDyn->addReloc({Target->TlsGotRel, In<ELFT>::Got, 221 Body.getGotOffset<ELFT>(), false, &Body, 222 0}); 223 } 224 return Target->TlsGdRelaxSkip; 225 } 226 C.Relocations.push_back( 227 {Target->adjustRelaxExpr(Type, nullptr, R_RELAX_TLS_GD_TO_LE), Type, 228 Offset, Addend, &Body}); 229 return Target->TlsGdRelaxSkip; 230 } 231 232 // Initial-Exec relocs can be relaxed to Local-Exec if the symbol is locally 233 // defined. 234 if (Target->isTlsInitialExecRel(Type) && !Config->Shared && !IsPreemptible) { 235 C.Relocations.push_back( 236 {R_RELAX_TLS_IE_TO_LE, Type, Offset, Addend, &Body}); 237 return 1; 238 } 239 return 0; 240 } 241 242 template <endianness E> static int16_t readSignedLo16(const uint8_t *Loc) { 243 return read32<E>(Loc) & 0xffff; 244 } 245 246 template <class RelTy> 247 static uint32_t getMipsPairType(const RelTy *Rel, const SymbolBody &Sym) { 248 switch (Rel->getType(Config->Mips64EL)) { 249 case R_MIPS_HI16: 250 return R_MIPS_LO16; 251 case R_MIPS_GOT16: 252 return Sym.isLocal() ? R_MIPS_LO16 : R_MIPS_NONE; 253 case R_MIPS_PCHI16: 254 return R_MIPS_PCLO16; 255 case R_MICROMIPS_HI16: 256 return R_MICROMIPS_LO16; 257 default: 258 return R_MIPS_NONE; 259 } 260 } 261 262 template <class ELFT, class RelTy> 263 static int32_t findMipsPairedAddend(const uint8_t *Buf, const uint8_t *BufLoc, 264 SymbolBody &Sym, const RelTy *Rel, 265 const RelTy *End) { 266 uint32_t SymIndex = Rel->getSymbol(Config->Mips64EL); 267 uint32_t Type = getMipsPairType(Rel, Sym); 268 269 // Some MIPS relocations use addend calculated from addend of the relocation 270 // itself and addend of paired relocation. ABI requires to compute such 271 // combined addend in case of REL relocation record format only. 272 // See p. 4-17 at ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 273 if (RelTy::IsRela || Type == R_MIPS_NONE) 274 return 0; 275 276 for (const RelTy *RI = Rel; RI != End; ++RI) { 277 if (RI->getType(Config->Mips64EL) != Type) 278 continue; 279 if (RI->getSymbol(Config->Mips64EL) != SymIndex) 280 continue; 281 const endianness E = ELFT::TargetEndianness; 282 return ((read32<E>(BufLoc) & 0xffff) << 16) + 283 readSignedLo16<E>(Buf + RI->r_offset); 284 } 285 warn("can't find matching " + toString(Type) + " relocation for " + 286 toString(Rel->getType(Config->Mips64EL))); 287 return 0; 288 } 289 290 // True if non-preemptable symbol always has the same value regardless of where 291 // the DSO is loaded. 292 template <class ELFT> static bool isAbsolute(const SymbolBody &Body) { 293 if (Body.isUndefined()) 294 return !Body.isLocal() && Body.symbol()->isWeak(); 295 if (const auto *DR = dyn_cast<DefinedRegular>(&Body)) 296 return DR->Section == nullptr; // Absolute symbol. 297 return false; 298 } 299 300 template <class ELFT> static bool isAbsoluteValue(const SymbolBody &Body) { 301 return isAbsolute<ELFT>(Body) || Body.isTls(); 302 } 303 304 static bool needsPlt(RelExpr Expr) { 305 return isRelExprOneOf<R_PLT_PC, R_PPC_PLT_OPD, R_PLT, R_PLT_PAGE_PC>(Expr); 306 } 307 308 // True if this expression is of the form Sym - X, where X is a position in the 309 // file (PC, or GOT for example). 310 static bool isRelExpr(RelExpr Expr) { 311 return isRelExprOneOf<R_PC, R_GOTREL, R_GOTREL_FROM_END, R_MIPS_GOTREL, 312 R_PAGE_PC, R_RELAX_GOT_PC>(Expr); 313 } 314 315 template <class ELFT> 316 static bool 317 isStaticLinkTimeConstant(RelExpr E, uint32_t Type, const SymbolBody &Body, 318 InputSectionBase &S, typename ELFT::uint RelOff) { 319 // These expressions always compute a constant 320 if (isRelExprOneOf<R_SIZE, R_GOT_FROM_END, R_GOT_OFF, R_MIPS_GOT_LOCAL_PAGE, 321 R_MIPS_GOT_OFF, R_MIPS_GOT_OFF32, R_MIPS_TLSGD, 322 R_GOT_PAGE_PC, R_GOT_PC, R_PLT_PC, R_TLSGD_PC, R_TLSGD, 323 R_PPC_PLT_OPD, R_TLSDESC_CALL, R_TLSDESC_PAGE, R_HINT>(E)) 324 return true; 325 326 // These never do, except if the entire file is position dependent or if 327 // only the low bits are used. 328 if (E == R_GOT || E == R_PLT || E == R_TLSDESC) 329 return Target->usesOnlyLowPageBits(Type) || !Config->pic(); 330 331 if (isPreemptible(Body, Type)) 332 return false; 333 334 if (!Config->pic()) 335 return true; 336 337 bool AbsVal = isAbsoluteValue<ELFT>(Body); 338 bool RelE = isRelExpr(E); 339 if (AbsVal && !RelE) 340 return true; 341 if (!AbsVal && RelE) 342 return true; 343 344 // Relative relocation to an absolute value. This is normally unrepresentable, 345 // but if the relocation refers to a weak undefined symbol, we allow it to 346 // resolve to the image base. This is a little strange, but it allows us to 347 // link function calls to such symbols. Normally such a call will be guarded 348 // with a comparison, which will load a zero from the GOT. 349 // Another special case is MIPS _gp_disp symbol which represents offset 350 // between start of a function and '_gp' value and defined as absolute just 351 // to simplify the code. 352 if (AbsVal && RelE) { 353 if (Body.isUndefined() && !Body.isLocal() && Body.symbol()->isWeak()) 354 return true; 355 if (&Body == ElfSym::MipsGpDisp) 356 return true; 357 error(S.getLocation<ELFT>(RelOff) + ": relocation " + toString(Type) + 358 " cannot refer to absolute symbol '" + toString(Body) + 359 "' defined in " + toString(Body.File)); 360 return true; 361 } 362 363 return Target->usesOnlyLowPageBits(Type); 364 } 365 366 static RelExpr toPlt(RelExpr Expr) { 367 if (Expr == R_PPC_OPD) 368 return R_PPC_PLT_OPD; 369 if (Expr == R_PC) 370 return R_PLT_PC; 371 if (Expr == R_PAGE_PC) 372 return R_PLT_PAGE_PC; 373 if (Expr == R_ABS) 374 return R_PLT; 375 return Expr; 376 } 377 378 static RelExpr fromPlt(RelExpr Expr) { 379 // We decided not to use a plt. Optimize a reference to the plt to a 380 // reference to the symbol itself. 381 if (Expr == R_PLT_PC) 382 return R_PC; 383 if (Expr == R_PPC_PLT_OPD) 384 return R_PPC_OPD; 385 if (Expr == R_PLT) 386 return R_ABS; 387 return Expr; 388 } 389 390 template <class ELFT> static bool isReadOnly(SharedSymbol *SS) { 391 typedef typename ELFT::Phdr Elf_Phdr; 392 uint64_t Value = SS->getValue<ELFT>(); 393 394 // Determine if the symbol is read-only by scanning the DSO's program headers. 395 auto *File = cast<SharedFile<ELFT>>(SS->File); 396 for (const Elf_Phdr &Phdr : check(File->getObj().program_headers())) 397 if ((Phdr.p_type == ELF::PT_LOAD || Phdr.p_type == ELF::PT_GNU_RELRO) && 398 !(Phdr.p_flags & ELF::PF_W) && Value >= Phdr.p_vaddr && 399 Value < Phdr.p_vaddr + Phdr.p_memsz) 400 return true; 401 return false; 402 } 403 404 // Returns symbols at the same offset as a given symbol, including SS itself. 405 // 406 // If two or more symbols are at the same offset, and at least one of 407 // them are copied by a copy relocation, all of them need to be copied. 408 // Otherwise, they would refer different places at runtime. 409 template <class ELFT> 410 static std::vector<SharedSymbol *> getSymbolsAt(SharedSymbol *SS) { 411 typedef typename ELFT::Sym Elf_Sym; 412 413 auto *File = cast<SharedFile<ELFT>>(SS->File); 414 uint64_t Shndx = SS->getShndx<ELFT>(); 415 uint64_t Value = SS->getValue<ELFT>(); 416 417 std::vector<SharedSymbol *> Ret; 418 for (const Elf_Sym &S : File->getGlobalSymbols()) { 419 if (S.st_shndx != Shndx || S.st_value != Value) 420 continue; 421 StringRef Name = check(S.getName(File->getStringTable())); 422 SymbolBody *Sym = Symtab<ELFT>::X->find(Name); 423 if (auto *Alias = dyn_cast_or_null<SharedSymbol>(Sym)) 424 Ret.push_back(Alias); 425 } 426 return Ret; 427 } 428 429 // Reserve space in .bss or .bss.rel.ro for copy relocation. 430 // 431 // The copy relocation is pretty much a hack. If you use a copy relocation 432 // in your program, not only the symbol name but the symbol's size, RW/RO 433 // bit and alignment become part of the ABI. In addition to that, if the 434 // symbol has aliases, the aliases become part of the ABI. That's subtle, 435 // but if you violate that implicit ABI, that can cause very counter- 436 // intuitive consequences. 437 // 438 // So, what is the copy relocation? It's for linking non-position 439 // independent code to DSOs. In an ideal world, all references to data 440 // exported by DSOs should go indirectly through GOT. But if object files 441 // are compiled as non-PIC, all data references are direct. There is no 442 // way for the linker to transform the code to use GOT, as machine 443 // instructions are already set in stone in object files. This is where 444 // the copy relocation takes a role. 445 // 446 // A copy relocation instructs the dynamic linker to copy data from a DSO 447 // to a specified address (which is usually in .bss) at load-time. If the 448 // static linker (that's us) finds a direct data reference to a DSO 449 // symbol, it creates a copy relocation, so that the symbol can be 450 // resolved as if it were in .bss rather than in a DSO. 451 // 452 // As you can see in this function, we create a copy relocation for the 453 // dynamic linker, and the relocation contains not only symbol name but 454 // various other informtion about the symbol. So, such attributes become a 455 // part of the ABI. 456 // 457 // Note for application developers: I can give you a piece of advice if 458 // you are writing a shared library. You probably should export only 459 // functions from your library. You shouldn't export variables. 460 // 461 // As an example what can happen when you export variables without knowing 462 // the semantics of copy relocations, assume that you have an exported 463 // variable of type T. It is an ABI-breaking change to add new members at 464 // end of T even though doing that doesn't change the layout of the 465 // existing members. That's because the space for the new members are not 466 // reserved in .bss unless you recompile the main program. That means they 467 // are likely to overlap with other data that happens to be laid out next 468 // to the variable in .bss. This kind of issue is sometimes very hard to 469 // debug. What's a solution? Instead of exporting a varaible V from a DSO, 470 // define an accessor getV(). 471 template <class ELFT> static void addCopyRelSymbol(SharedSymbol *SS) { 472 typedef typename ELFT::uint uintX_t; 473 474 // Copy relocation against zero-sized symbol doesn't make sense. 475 uintX_t SymSize = SS->template getSize<ELFT>(); 476 if (SymSize == 0) 477 fatal("cannot create a copy relocation for symbol " + toString(*SS)); 478 479 // See if this symbol is in a read-only segment. If so, preserve the symbol's 480 // memory protection by reserving space in the .bss.rel.ro section. 481 bool IsReadOnly = isReadOnly<ELFT>(SS); 482 OutputSection *OSec = IsReadOnly ? Out::BssRelRo : Out::Bss; 483 484 // Create a SyntheticSection in Out to hold the .bss and the Copy Reloc. 485 auto *ISec = 486 make<CopyRelSection<ELFT>>(IsReadOnly, SS->getAlignment<ELFT>(), SymSize); 487 OSec->addSection(ISec); 488 489 // Look through the DSO's dynamic symbol table for aliases and create a 490 // dynamic symbol for each one. This causes the copy relocation to correctly 491 // interpose any aliases. 492 for (SharedSymbol *Sym : getSymbolsAt<ELFT>(SS)) { 493 Sym->NeedsCopy = true; 494 Sym->Section = ISec; 495 Sym->symbol()->IsUsedInRegularObj = true; 496 } 497 498 In<ELFT>::RelaDyn->addReloc({Target->CopyRel, ISec, 0, false, SS, 0}); 499 } 500 501 template <class ELFT> 502 static RelExpr adjustExpr(const elf::ObjectFile<ELFT> &File, SymbolBody &Body, 503 bool IsWrite, RelExpr Expr, uint32_t Type, 504 const uint8_t *Data, InputSectionBase &S, 505 typename ELFT::uint RelOff) { 506 bool Preemptible = isPreemptible(Body, Type); 507 if (Body.isGnuIFunc()) { 508 Expr = toPlt(Expr); 509 } else if (!Preemptible) { 510 if (needsPlt(Expr)) 511 Expr = fromPlt(Expr); 512 if (Expr == R_GOT_PC && !isAbsoluteValue<ELFT>(Body)) 513 Expr = Target->adjustRelaxExpr(Type, Data, Expr); 514 } 515 516 if (IsWrite || isStaticLinkTimeConstant<ELFT>(Expr, Type, Body, S, RelOff)) 517 return Expr; 518 519 // This relocation would require the dynamic linker to write a value to read 520 // only memory. We can hack around it if we are producing an executable and 521 // the refered symbol can be preemepted to refer to the executable. 522 if (Config->Shared || (Config->pic() && !isRelExpr(Expr))) { 523 error(S.getLocation<ELFT>(RelOff) + ": can't create dynamic relocation " + 524 toString(Type) + " against " + 525 (Body.getName().empty() ? "local symbol in readonly segment" 526 : "symbol '" + toString(Body) + "'") + 527 " defined in " + toString(Body.File)); 528 return Expr; 529 } 530 if (Body.getVisibility() != STV_DEFAULT) { 531 error(S.getLocation<ELFT>(RelOff) + ": cannot preempt symbol '" + 532 toString(Body) + "' defined in " + toString(Body.File)); 533 return Expr; 534 } 535 if (Body.isObject()) { 536 // Produce a copy relocation. 537 auto *B = cast<SharedSymbol>(&Body); 538 if (!B->NeedsCopy) { 539 if (Config->ZNocopyreloc) 540 error(S.getLocation<ELFT>(RelOff) + ": unresolvable relocation " + 541 toString(Type) + " against symbol '" + toString(*B) + 542 "'; recompile with -fPIC or remove '-z nocopyreloc'"); 543 544 addCopyRelSymbol<ELFT>(B); 545 } 546 return Expr; 547 } 548 if (Body.isFunc()) { 549 // This handles a non PIC program call to function in a shared library. In 550 // an ideal world, we could just report an error saying the relocation can 551 // overflow at runtime. In the real world with glibc, crt1.o has a 552 // R_X86_64_PC32 pointing to libc.so. 553 // 554 // The general idea on how to handle such cases is to create a PLT entry and 555 // use that as the function value. 556 // 557 // For the static linking part, we just return a plt expr and everything 558 // else will use the the PLT entry as the address. 559 // 560 // The remaining problem is making sure pointer equality still works. We 561 // need the help of the dynamic linker for that. We let it know that we have 562 // a direct reference to a so symbol by creating an undefined symbol with a 563 // non zero st_value. Seeing that, the dynamic linker resolves the symbol to 564 // the value of the symbol we created. This is true even for got entries, so 565 // pointer equality is maintained. To avoid an infinite loop, the only entry 566 // that points to the real function is a dedicated got entry used by the 567 // plt. That is identified by special relocation types (R_X86_64_JUMP_SLOT, 568 // R_386_JMP_SLOT, etc). 569 Body.NeedsPltAddr = true; 570 return toPlt(Expr); 571 } 572 error("symbol '" + toString(Body) + "' defined in " + toString(Body.File) + 573 " is missing type"); 574 575 return Expr; 576 } 577 578 template <class ELFT, class RelTy> 579 static int64_t computeAddend(const elf::ObjectFile<ELFT> &File, 580 const uint8_t *SectionData, const RelTy *End, 581 const RelTy &RI, RelExpr Expr, SymbolBody &Body) { 582 uint32_t Type = RI.getType(Config->Mips64EL); 583 int64_t Addend = getAddend<ELFT>(RI); 584 const uint8_t *BufLoc = SectionData + RI.r_offset; 585 if (!RelTy::IsRela) 586 Addend += Target->getImplicitAddend(BufLoc, Type); 587 if (Config->EMachine == EM_MIPS) { 588 Addend += findMipsPairedAddend<ELFT>(SectionData, BufLoc, Body, &RI, End); 589 if (Type == R_MIPS_LO16 && Expr == R_PC) 590 // R_MIPS_LO16 expression has R_PC type iif the target is _gp_disp 591 // symbol. In that case we should use the following formula for 592 // calculation "AHL + GP - P + 4". Let's add 4 right here. 593 // For details see p. 4-19 at 594 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 595 Addend += 4; 596 if (Expr == R_MIPS_GOTREL && Body.isLocal()) 597 Addend += File.MipsGp0; 598 } 599 if (Config->pic() && Config->EMachine == EM_PPC64 && Type == R_PPC64_TOC) 600 Addend += getPPC64TocBase(); 601 return Addend; 602 } 603 604 template <class ELFT> 605 static void reportUndefined(SymbolBody &Sym, InputSectionBase &S, 606 typename ELFT::uint Offset) { 607 bool CanBeExternal = Sym.symbol()->computeBinding() != STB_LOCAL && 608 Sym.getVisibility() == STV_DEFAULT; 609 if (Config->UnresolvedSymbols == UnresolvedPolicy::IgnoreAll || 610 (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore && CanBeExternal)) 611 return; 612 613 std::string Msg = S.getLocation<ELFT>(Offset) + ": undefined symbol '" + 614 toString(Sym) + "'"; 615 616 if (Config->UnresolvedSymbols == UnresolvedPolicy::WarnAll || 617 (Config->UnresolvedSymbols == UnresolvedPolicy::Warn && CanBeExternal)) 618 warn(Msg); 619 else 620 error(Msg); 621 } 622 623 template <class RelTy> 624 static std::pair<uint32_t, uint32_t> 625 mergeMipsN32RelTypes(uint32_t Type, uint32_t Offset, RelTy *I, RelTy *E) { 626 // MIPS N32 ABI treats series of successive relocations with the same offset 627 // as a single relocation. The similar approach used by N64 ABI, but this ABI 628 // packs all relocations into the single relocation record. Here we emulate 629 // this for the N32 ABI. Iterate over relocation with the same offset and put 630 // theirs types into the single bit-set. 631 uint32_t Processed = 0; 632 for (; I != E && Offset == I->r_offset; ++I) { 633 ++Processed; 634 Type |= I->getType(Config->Mips64EL) << (8 * Processed); 635 } 636 return std::make_pair(Type, Processed); 637 } 638 639 // The reason we have to do this early scan is as follows 640 // * To mmap the output file, we need to know the size 641 // * For that, we need to know how many dynamic relocs we will have. 642 // It might be possible to avoid this by outputting the file with write: 643 // * Write the allocated output sections, computing addresses. 644 // * Apply relocations, recording which ones require a dynamic reloc. 645 // * Write the dynamic relocations. 646 // * Write the rest of the file. 647 // This would have some drawbacks. For example, we would only know if .rela.dyn 648 // is needed after applying relocations. If it is, it will go after rw and rx 649 // sections. Given that it is ro, we will need an extra PT_LOAD. This 650 // complicates things for the dynamic linker and means we would have to reserve 651 // space for the extra PT_LOAD even if we end up not using it. 652 template <class ELFT, class RelTy> 653 static void scanRelocs(InputSectionBase &C, ArrayRef<RelTy> Rels) { 654 typedef typename ELFT::uint uintX_t; 655 656 bool IsWrite = C.Flags & SHF_WRITE; 657 658 auto AddDyn = [=](const DynamicReloc<ELFT> &Reloc) { 659 In<ELFT>::RelaDyn->addReloc(Reloc); 660 }; 661 662 const elf::ObjectFile<ELFT> *File = C.getFile<ELFT>(); 663 ArrayRef<uint8_t> SectionData = C.Data; 664 const uint8_t *Buf = SectionData.begin(); 665 666 ArrayRef<EhSectionPiece> Pieces; 667 if (auto *Eh = dyn_cast<EhInputSection<ELFT>>(&C)) 668 Pieces = Eh->Pieces; 669 670 ArrayRef<EhSectionPiece>::iterator PieceI = Pieces.begin(); 671 ArrayRef<EhSectionPiece>::iterator PieceE = Pieces.end(); 672 673 for (auto I = Rels.begin(), E = Rels.end(); I != E; ++I) { 674 const RelTy &RI = *I; 675 SymbolBody &Body = File->getRelocTargetSym(RI); 676 uint32_t Type = RI.getType(Config->Mips64EL); 677 678 if (Config->MipsN32Abi) { 679 uint32_t Processed; 680 std::tie(Type, Processed) = 681 mergeMipsN32RelTypes(Type, RI.r_offset, I + 1, E); 682 I += Processed; 683 } 684 685 // We only report undefined symbols if they are referenced somewhere in the 686 // code. 687 if (!Body.isLocal() && Body.isUndefined() && !Body.symbol()->isWeak()) 688 reportUndefined<ELFT>(Body, C, RI.r_offset); 689 690 RelExpr Expr = Target->getRelExpr(Type, Body); 691 692 // Ignore "hint" relocations because they are only markers for relaxation. 693 if (isRelExprOneOf<R_HINT, R_NONE>(Expr)) 694 continue; 695 696 bool Preemptible = isPreemptible(Body, Type); 697 Expr = adjustExpr(*File, Body, IsWrite, Expr, Type, Buf + RI.r_offset, C, 698 RI.r_offset); 699 if (ErrorCount) 700 continue; 701 702 // Skip a relocation that points to a dead piece 703 // in a eh_frame section. 704 while (PieceI != PieceE && 705 (PieceI->InputOff + PieceI->size() <= RI.r_offset)) 706 ++PieceI; 707 708 // Compute the offset of this section in the output section. We do it here 709 // to try to compute it only once. 710 uintX_t Offset; 711 if (PieceI != PieceE) { 712 assert(PieceI->InputOff <= RI.r_offset && "Relocation not in any piece"); 713 if (PieceI->OutputOff == -1) 714 continue; 715 Offset = PieceI->OutputOff + RI.r_offset - PieceI->InputOff; 716 } else { 717 Offset = RI.r_offset; 718 } 719 720 // This relocation does not require got entry, but it is relative to got and 721 // needs it to be created. Here we request for that. 722 if (isRelExprOneOf<R_GOTONLY_PC, R_GOTONLY_PC_FROM_END, R_GOTREL, 723 R_GOTREL_FROM_END, R_PPC_TOC>(Expr)) 724 In<ELFT>::Got->HasGotOffRel = true; 725 726 int64_t Addend = computeAddend(*File, Buf, E, RI, Expr, Body); 727 728 if (unsigned Processed = 729 handleTlsRelocation<ELFT>(Type, Body, C, Offset, Addend, Expr)) { 730 I += (Processed - 1); 731 continue; 732 } 733 734 if (Expr == R_TLSDESC_CALL) 735 continue; 736 737 if (needsPlt(Expr) || 738 refersToGotEntry(Expr) || !isPreemptible(Body, Type)) { 739 // If the relocation points to something in the file, we can process it. 740 bool Constant = 741 isStaticLinkTimeConstant<ELFT>(Expr, Type, Body, C, RI.r_offset); 742 743 // If the output being produced is position independent, the final value 744 // is still not known. In that case we still need some help from the 745 // dynamic linker. We can however do better than just copying the incoming 746 // relocation. We can process some of it and and just ask the dynamic 747 // linker to add the load address. 748 if (!Constant) 749 AddDyn({Target->RelativeRel, &C, Offset, true, &Body, Addend}); 750 751 // If the produced value is a constant, we just remember to write it 752 // when outputting this section. We also have to do it if the format 753 // uses Elf_Rel, since in that case the written value is the addend. 754 if (Constant || !RelTy::IsRela) 755 C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); 756 } else { 757 // We don't know anything about the finaly symbol. Just ask the dynamic 758 // linker to handle the relocation for us. 759 if (!Target->isPicRel(Type)) 760 error(C.getLocation<ELFT>(Offset) + ": relocation " + toString(Type) + 761 " cannot be used against shared object; recompile with -fPIC."); 762 AddDyn({Target->getDynRel(Type), &C, Offset, false, &Body, Addend}); 763 764 // MIPS ABI turns using of GOT and dynamic relocations inside out. 765 // While regular ABI uses dynamic relocations to fill up GOT entries 766 // MIPS ABI requires dynamic linker to fills up GOT entries using 767 // specially sorted dynamic symbol table. This affects even dynamic 768 // relocations against symbols which do not require GOT entries 769 // creation explicitly, i.e. do not have any GOT-relocations. So if 770 // a preemptible symbol has a dynamic relocation we anyway have 771 // to create a GOT entry for it. 772 // If a non-preemptible symbol has a dynamic relocation against it, 773 // dynamic linker takes it st_value, adds offset and writes down 774 // result of the dynamic relocation. In case of preemptible symbol 775 // dynamic linker performs symbol resolution, writes the symbol value 776 // to the GOT entry and reads the GOT entry when it needs to perform 777 // a dynamic relocation. 778 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf p.4-19 779 if (Config->EMachine == EM_MIPS) 780 In<ELFT>::MipsGot->addEntry(Body, Addend, Expr); 781 continue; 782 } 783 784 // At this point we are done with the relocated position. Some relocations 785 // also require us to create a got or plt entry. 786 787 // If a relocation needs PLT, we create a PLT and a GOT slot for the symbol. 788 if (needsPlt(Expr)) { 789 if (Body.isInPlt()) 790 continue; 791 792 if (Body.isGnuIFunc() && !Preemptible) { 793 In<ELFT>::Iplt->addEntry(Body); 794 In<ELFT>::IgotPlt->addEntry(Body); 795 In<ELFT>::RelaIplt->addReloc({Target->IRelativeRel, In<ELFT>::IgotPlt, 796 Body.getGotPltOffset<ELFT>(), 797 !Preemptible, &Body, 0}); 798 } else { 799 In<ELFT>::Plt->addEntry(Body); 800 In<ELFT>::GotPlt->addEntry(Body); 801 In<ELFT>::RelaPlt->addReloc({Target->PltRel, In<ELFT>::GotPlt, 802 Body.getGotPltOffset<ELFT>(), !Preemptible, 803 &Body, 0}); 804 } 805 continue; 806 } 807 808 if (refersToGotEntry(Expr)) { 809 if (Config->EMachine == EM_MIPS) { 810 // MIPS ABI has special rules to process GOT entries and doesn't 811 // require relocation entries for them. A special case is TLS 812 // relocations. In that case dynamic loader applies dynamic 813 // relocations to initialize TLS GOT entries. 814 // See "Global Offset Table" in Chapter 5 in the following document 815 // for detailed description: 816 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 817 In<ELFT>::MipsGot->addEntry(Body, Addend, Expr); 818 if (Body.isTls() && Body.isPreemptible()) 819 AddDyn({Target->TlsGotRel, In<ELFT>::MipsGot, 820 Body.getGotOffset<ELFT>(), false, &Body, 0}); 821 continue; 822 } 823 824 if (Body.isInGot()) 825 continue; 826 827 In<ELFT>::Got->addEntry(Body); 828 uintX_t Off = Body.getGotOffset<ELFT>(); 829 uint32_t DynType; 830 RelExpr GotRE = R_ABS; 831 if (Body.isTls()) { 832 DynType = Target->TlsGotRel; 833 GotRE = R_TLS; 834 } else if (!Preemptible && Config->pic() && !isAbsolute<ELFT>(Body)) 835 DynType = Target->RelativeRel; 836 else 837 DynType = Target->GotRel; 838 839 // FIXME: this logic is almost duplicated above. 840 bool Constant = 841 !Preemptible && !(Config->pic() && !isAbsolute<ELFT>(Body)); 842 if (!Constant) 843 AddDyn({DynType, In<ELFT>::Got, Off, !Preemptible, &Body, 0}); 844 if (Constant || (!RelTy::IsRela && !Preemptible)) 845 In<ELFT>::Got->Relocations.push_back({GotRE, DynType, Off, 0, &Body}); 846 continue; 847 } 848 } 849 } 850 851 template <class ELFT> void scanRelocations(InputSectionBase &S) { 852 if (S.AreRelocsRela) 853 scanRelocs<ELFT>(S, S.relas<ELFT>()); 854 else 855 scanRelocs<ELFT>(S, S.rels<ELFT>()); 856 } 857 858 // Insert the Thunks for OutputSection OS into their designated place 859 // in the Sections vector, and recalculate the InputSection output section 860 // offsets. 861 // This may invalidate any output section offsets stored outside of InputSection 862 template <class ELFT> 863 static void mergeThunks(OutputSection *OS, 864 std::vector<ThunkSection<ELFT> *> &Thunks) { 865 // Order Thunks in ascending OutSecOff 866 auto ThunkCmp = [](const ThunkSection<ELFT> *A, const ThunkSection<ELFT> *B) { 867 return A->OutSecOff < B->OutSecOff; 868 }; 869 std::stable_sort(Thunks.begin(), Thunks.end(), ThunkCmp); 870 871 // Merge sorted vectors of Thunks and InputSections by OutSecOff 872 std::vector<InputSection *> Tmp; 873 Tmp.reserve(OS->Sections.size() + Thunks.size()); 874 auto MergeCmp = [](const InputSection *A, const InputSection *B) { 875 // std::merge requires a strict weak ordering. 876 if (A->OutSecOff < B->OutSecOff) 877 return true; 878 if (A->OutSecOff == B->OutSecOff) 879 // Check if Thunk is immediately before any specific Target InputSection 880 // for example Mips LA25 Thunks. 881 if (auto *TA = dyn_cast<ThunkSection<ELFT>>(A)) 882 if (TA && TA->getTargetInputSection() == B) 883 return true; 884 return false; 885 }; 886 std::merge(OS->Sections.begin(), OS->Sections.end(), Thunks.begin(), 887 Thunks.end(), std::back_inserter(Tmp), MergeCmp); 888 OS->Sections = std::move(Tmp); 889 OS->assignOffsets<ELFT>(); 890 } 891 892 // Process all relocations from the InputSections that have been assigned 893 // to OutputSections and redirect through Thunks if needed. 894 // 895 // createThunks must be called after scanRelocs has created the Relocations for 896 // each InputSection. It must be called before the static symbol table is 897 // finalized. If any Thunks are added to an OutputSection the output section 898 // offsets of the InputSections will change. 899 // 900 // FIXME: All Thunks are assumed to be in range of the relocation. Range 901 // extension Thunks are not yet supported. 902 template <class ELFT> 903 void createThunks(ArrayRef<OutputSection *> OutputSections) { 904 // Track Symbols that already have a Thunk 905 DenseMap<SymbolBody *, Thunk<ELFT> *> ThunkedSymbols; 906 // Track InputSections that have a ThunkSection placed in front 907 DenseMap<InputSection *, ThunkSection<ELFT> *> ThunkedSections; 908 // Track the ThunksSections that need to be inserted into an OutputSection 909 std::map<OutputSection *, std::vector<ThunkSection<ELFT> *>> ThunkSections; 910 911 // Find or create a Thunk for Body for relocation Type 912 auto GetThunk = [&](SymbolBody &Body, uint32_t Type) { 913 auto res = ThunkedSymbols.insert({&Body, nullptr}); 914 if (res.second == true) 915 res.first->second = addThunk<ELFT>(Type, Body); 916 return std::make_pair(res.first->second, res.second); 917 }; 918 919 // Find or create a ThunkSection to be placed immediately before IS 920 auto GetISThunkSec = [&](InputSection *IS, OutputSection *OS) { 921 ThunkSection<ELFT> *TS = ThunkedSections.lookup(IS); 922 if (TS) 923 return TS; 924 auto *TOS = cast<OutputSection>(IS->OutSec); 925 TS = make<ThunkSection<ELFT>>(TOS, IS->OutSecOff); 926 ThunkSections[OS].push_back(TS); 927 ThunkedSections[IS] = TS; 928 return TS; 929 }; 930 // Find or create a ThunkSection to be placed as last executable section in 931 // OS. 932 auto GetOSThunkSec = [&](ThunkSection<ELFT> *&TS, OutputSection *OS) { 933 if (TS == nullptr) { 934 uint32_t Off = 0; 935 for (auto *IS : OS->Sections) { 936 Off = IS->OutSecOff + IS->template getSize<ELFT>(); 937 if ((IS->Flags & SHF_EXECINSTR) == 0) 938 break; 939 } 940 TS = make<ThunkSection<ELFT>>(OS, Off); 941 ThunkSections[OS].push_back(TS); 942 } 943 return TS; 944 }; 945 // Create all the Thunks and insert them into synthetic ThunkSections. The 946 // ThunkSections are later inserted back into the OutputSection. 947 948 // We separate the creation of ThunkSections from the insertion of the 949 // ThunkSections back into the OutputSection as ThunkSections are not always 950 // inserted into the same OutputSection as the caller. 951 for (OutputSection *Base : OutputSections) { 952 auto *OS = dyn_cast<OutputSection>(Base); 953 if (OS == nullptr) 954 continue; 955 956 ThunkSection<ELFT> *OSTS = nullptr; 957 for (InputSection *IS : OS->Sections) { 958 for (Relocation &Rel : IS->Relocations) { 959 SymbolBody &Body = *Rel.Sym; 960 if (Target->needsThunk(Rel.Expr, Rel.Type, IS->template getFile<ELFT>(), 961 Body)) { 962 Thunk<ELFT> *T; 963 bool IsNew; 964 std::tie(T, IsNew) = GetThunk(Body, Rel.Type); 965 if (IsNew) { 966 // Find or create a ThunkSection for the new Thunk 967 ThunkSection<ELFT> *TS; 968 if (auto *TIS = T->getTargetInputSection()) 969 TS = GetISThunkSec(TIS, OS); 970 else 971 TS = GetOSThunkSec(OSTS, OS); 972 TS->addThunk(T); 973 } 974 // Redirect relocation to Thunk, we never go via the PLT to a Thunk 975 Rel.Sym = T->ThunkSym; 976 Rel.Expr = fromPlt(Rel.Expr); 977 } 978 } 979 } 980 } 981 982 // Merge all created synthetic ThunkSections back into OutputSection 983 for (auto &KV : ThunkSections) 984 mergeThunks<ELFT>(KV.first, KV.second); 985 } 986 987 template void scanRelocations<ELF32LE>(InputSectionBase &); 988 template void scanRelocations<ELF32BE>(InputSectionBase &); 989 template void scanRelocations<ELF64LE>(InputSectionBase &); 990 template void scanRelocations<ELF64BE>(InputSectionBase &); 991 992 template void createThunks<ELF32LE>(ArrayRef<OutputSection *>); 993 template void createThunks<ELF32BE>(ArrayRef<OutputSection *>); 994 template void createThunks<ELF64LE>(ArrayRef<OutputSection *>); 995 template void createThunks<ELF64BE>(ArrayRef<OutputSection *>); 996 } 997 } 998