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