1 //===- InputFiles.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 #include "InputFiles.h"
11 #include "InputSection.h"
12 #include "Error.h"
13 #include "Symbols.h"
14 #include "llvm/ADT/STLExtras.h"
15 
16 using namespace llvm;
17 using namespace llvm::ELF;
18 using namespace llvm::object;
19 using namespace llvm::sys::fs;
20 
21 using namespace lld;
22 using namespace lld::elf2;
23 
24 namespace {
25 class ECRAII {
26   std::error_code EC;
27 
28 public:
29   std::error_code &getEC() { return EC; }
30   ~ECRAII() { error(EC); }
31 };
32 }
33 
34 template <class ELFT>
35 ELFFileBase<ELFT>::ELFFileBase(Kind K, MemoryBufferRef M)
36     : InputFile(K, M), ELFObj(MB.getBuffer(), ECRAII().getEC()) {}
37 
38 template <class ELFT>
39 typename ELFFileBase<ELFT>::Elf_Sym_Range
40 ELFFileBase<ELFT>::getSymbolsHelper(bool Local) {
41   if (!Symtab)
42     return Elf_Sym_Range(nullptr, nullptr);
43   Elf_Sym_Range Syms = ELFObj.symbols(Symtab);
44   uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
45   uint32_t FirstNonLocal = Symtab->sh_info;
46   if (FirstNonLocal > NumSymbols)
47     error("Invalid sh_info in symbol table");
48   if (!Local)
49     return make_range(Syms.begin() + FirstNonLocal, Syms.end());
50   // +1 to skip over dummy symbol.
51   return make_range(Syms.begin() + 1, Syms.begin() + FirstNonLocal);
52 }
53 
54 template <class ELFT> void ELFFileBase<ELFT>::initStringTable() {
55   if (!Symtab)
56     return;
57   ErrorOr<StringRef> StringTableOrErr = ELFObj.getStringTableForSymtab(*Symtab);
58   error(StringTableOrErr.getError());
59   StringTable = *StringTableOrErr;
60 }
61 
62 template <class ELFT>
63 typename ELFFileBase<ELFT>::Elf_Sym_Range
64 ELFFileBase<ELFT>::getNonLocalSymbols() {
65   return getSymbolsHelper(false);
66 }
67 
68 template <class ELFT>
69 ObjectFile<ELFT>::ObjectFile(MemoryBufferRef M)
70     : ELFFileBase<ELFT>(Base::ObjectKind, M) {}
71 
72 template <class ELFT>
73 typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() {
74   return this->getSymbolsHelper(true);
75 }
76 
77 template <class ELFT>
78 void elf2::ObjectFile<ELFT>::parse(DenseSet<StringRef> &Comdats) {
79   // Read section and symbol tables.
80   initializeSections(Comdats);
81   initializeSymbols();
82 }
83 
84 template <class ELFT>
85 StringRef ObjectFile<ELFT>::getShtGroupSignature(const Elf_Shdr &Sec) {
86   const ELFFile<ELFT> &Obj = this->ELFObj;
87   uint32_t SymtabdSectionIndex = Sec.sh_link;
88   ErrorOr<const Elf_Shdr *> SecOrErr = Obj.getSection(SymtabdSectionIndex);
89   error(SecOrErr);
90   const Elf_Shdr *SymtabSec = *SecOrErr;
91   uint32_t SymIndex = Sec.sh_info;
92   const Elf_Sym *Sym = Obj.getSymbol(SymtabSec, SymIndex);
93   ErrorOr<StringRef> StringTableOrErr = Obj.getStringTableForSymtab(*SymtabSec);
94   error(StringTableOrErr);
95   ErrorOr<StringRef> SignatureOrErr = Sym->getName(*StringTableOrErr);
96   error(SignatureOrErr);
97   return *SignatureOrErr;
98 }
99 
100 template <class ELFT>
101 ArrayRef<typename ObjectFile<ELFT>::GroupEntryType>
102 ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) {
103   const ELFFile<ELFT> &Obj = this->ELFObj;
104   ErrorOr<ArrayRef<GroupEntryType>> EntriesOrErr =
105       Obj.template getSectionContentsAsArray<GroupEntryType>(&Sec);
106   error(EntriesOrErr.getError());
107   ArrayRef<GroupEntryType> Entries = *EntriesOrErr;
108   if (Entries.empty() || Entries[0] != GRP_COMDAT)
109     error("Unsupported SHT_GROUP format");
110   return Entries.slice(1);
111 }
112 
113 template <class ELFT>
114 void elf2::ObjectFile<ELFT>::initializeSections(DenseSet<StringRef> &Comdats) {
115   uint64_t Size = this->ELFObj.getNumSections();
116   Sections.resize(Size);
117   unsigned I = -1;
118   const ELFFile<ELFT> &Obj = this->ELFObj;
119   for (const Elf_Shdr &Sec : Obj.sections()) {
120     ++I;
121     if (Sections[I] == &InputSection<ELFT>::Discarded)
122       continue;
123 
124     switch (Sec.sh_type) {
125     case SHT_GROUP:
126       Sections[I] = &InputSection<ELFT>::Discarded;
127       if (Comdats.insert(getShtGroupSignature(Sec)).second)
128         continue;
129       for (GroupEntryType E : getShtGroupEntries(Sec)) {
130         uint32_t SecIndex = E;
131         if (SecIndex >= Size)
132           error("Invalid section index in group");
133         Sections[SecIndex] = &InputSection<ELFT>::Discarded;
134       }
135       break;
136     case SHT_SYMTAB:
137       this->Symtab = &Sec;
138       break;
139     case SHT_SYMTAB_SHNDX: {
140       ErrorOr<ArrayRef<Elf_Word>> ErrorOrTable = Obj.getSHNDXTable(Sec);
141       error(ErrorOrTable);
142       SymtabSHNDX = *ErrorOrTable;
143       break;
144     }
145     case SHT_STRTAB:
146     case SHT_NULL:
147       break;
148     case SHT_RELA:
149     case SHT_REL: {
150       uint32_t RelocatedSectionIndex = Sec.sh_info;
151       if (RelocatedSectionIndex >= Size)
152         error("Invalid relocated section index");
153       InputSectionBase<ELFT> *RelocatedSection =
154           Sections[RelocatedSectionIndex];
155       if (!RelocatedSection)
156         error("Unsupported relocation reference");
157       if (auto *S = dyn_cast<InputSection<ELFT>>(RelocatedSection))
158         S->RelocSections.push_back(&Sec);
159       else
160         error("Relocations pointing to SHF_MERGE are not supported");
161       break;
162     }
163     default: {
164       uintX_t Flags = Sec.sh_flags;
165       if (Flags & SHF_MERGE && !(Flags & SHF_STRINGS)) {
166         if (Flags & SHF_WRITE)
167           error("Writable SHF_MERGE sections are not supported");
168         Sections[I] = new (this->Alloc) MergeInputSection<ELFT>(this, &Sec);
169       } else {
170         Sections[I] = new (this->Alloc) InputSection<ELFT>(this, &Sec);
171       }
172       break;
173     }
174     }
175   }
176 }
177 
178 template <class ELFT> void elf2::ObjectFile<ELFT>::initializeSymbols() {
179   this->initStringTable();
180   Elf_Sym_Range Syms = this->getNonLocalSymbols();
181   uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
182   this->SymbolBodies.reserve(NumSymbols);
183   for (const Elf_Sym &Sym : Syms)
184     this->SymbolBodies.push_back(createSymbolBody(this->StringTable, &Sym));
185 }
186 
187 template <class ELFT>
188 InputSectionBase<ELFT> *
189 elf2::ObjectFile<ELFT>::getSection(const Elf_Sym &Sym) const {
190   uint32_t Index = Sym.st_shndx;
191   if (Index == ELF::SHN_XINDEX)
192     Index = this->ELFObj.getExtendedSymbolTableIndex(&Sym, this->Symtab,
193                                                      SymtabSHNDX);
194   else if (Index == ELF::SHN_UNDEF || Index >= ELF::SHN_LORESERVE)
195     return nullptr;
196 
197   if (Index >= Sections.size() || !Index || !Sections[Index])
198     error("Invalid section index");
199   return Sections[Index];
200 }
201 
202 template <class ELFT>
203 SymbolBody *elf2::ObjectFile<ELFT>::createSymbolBody(StringRef StringTable,
204                                                      const Elf_Sym *Sym) {
205   ErrorOr<StringRef> NameOrErr = Sym->getName(StringTable);
206   error(NameOrErr.getError());
207   StringRef Name = *NameOrErr;
208 
209   switch (Sym->st_shndx) {
210   case SHN_ABS:
211     return new (this->Alloc) DefinedAbsolute<ELFT>(Name, *Sym);
212   case SHN_UNDEF:
213     return new (this->Alloc) Undefined<ELFT>(Name, *Sym);
214   case SHN_COMMON:
215     return new (this->Alloc) DefinedCommon<ELFT>(Name, *Sym);
216   }
217 
218   switch (Sym->getBinding()) {
219   default:
220     error("unexpected binding");
221   case STB_GLOBAL:
222   case STB_WEAK:
223   case STB_GNU_UNIQUE: {
224     InputSectionBase<ELFT> *Sec = getSection(*Sym);
225     if (Sec == &InputSection<ELFT>::Discarded)
226       return new (this->Alloc) Undefined<ELFT>(Name, *Sym);
227     return new (this->Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sec);
228   }
229   }
230 }
231 
232 static std::unique_ptr<Archive> openArchive(MemoryBufferRef MB) {
233   ErrorOr<std::unique_ptr<Archive>> ArchiveOrErr = Archive::create(MB);
234   error(ArchiveOrErr, "Failed to parse archive");
235   return std::move(*ArchiveOrErr);
236 }
237 
238 void ArchiveFile::parse() {
239   File = openArchive(MB);
240 
241   // Allocate a buffer for Lazy objects.
242   size_t NumSyms = File->getNumberOfSymbols();
243   LazySymbols.reserve(NumSyms);
244 
245   // Read the symbol table to construct Lazy objects.
246   for (const Archive::Symbol &Sym : File->symbols())
247     LazySymbols.emplace_back(this, Sym);
248 }
249 
250 // Returns a buffer pointing to a member file containing a given symbol.
251 MemoryBufferRef ArchiveFile::getMember(const Archive::Symbol *Sym) {
252   ErrorOr<Archive::child_iterator> ItOrErr = Sym->getMember();
253   error(ItOrErr, "Could not get the member for symbol " + Sym->getName());
254   Archive::child_iterator It = *ItOrErr;
255 
256   if (!Seen.insert(It->getChildOffset()).second)
257     return MemoryBufferRef();
258 
259   ErrorOr<MemoryBufferRef> Ret = It->getMemoryBufferRef();
260   error(Ret, "Could not get the buffer for the member defining symbol " +
261                  Sym->getName());
262   return *Ret;
263 }
264 
265 std::vector<MemoryBufferRef> ArchiveFile::getMembers() {
266   File = openArchive(MB);
267 
268   std::vector<MemoryBufferRef> Result;
269   for (const Archive::Child &Child : File->children()) {
270     ErrorOr<MemoryBufferRef> MbOrErr = Child.getMemoryBufferRef();
271     error(MbOrErr, "Could not get the buffer for a child of the archive " +
272                        File->getFileName());
273     Result.push_back(MbOrErr.get());
274   }
275   return Result;
276 }
277 
278 template <class ELFT>
279 SharedFile<ELFT>::SharedFile(MemoryBufferRef M)
280     : ELFFileBase<ELFT>(Base::SharedKind, M) {
281   AsNeeded = Config->AsNeeded;
282 }
283 
284 template <class ELFT> void SharedFile<ELFT>::parseSoName() {
285   typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
286   typedef typename ELFFile<ELFT>::uintX_t uintX_t;
287   const Elf_Shdr *DynamicSec = nullptr;
288 
289   const ELFFile<ELFT> Obj = this->ELFObj;
290   for (const Elf_Shdr &Sec : Obj.sections()) {
291     uint32_t Type = Sec.sh_type;
292     if (Type == SHT_DYNSYM)
293       this->Symtab = &Sec;
294     else if (Type == SHT_DYNAMIC)
295       DynamicSec = &Sec;
296   }
297 
298   this->initStringTable();
299   this->SoName = this->getName();
300 
301   if (!DynamicSec)
302     return;
303   auto *Begin =
304       reinterpret_cast<const Elf_Dyn *>(Obj.base() + DynamicSec->sh_offset);
305   const Elf_Dyn *End = Begin + DynamicSec->sh_size / sizeof(Elf_Dyn);
306 
307   for (const Elf_Dyn &Dyn : make_range(Begin, End)) {
308     if (Dyn.d_tag == DT_SONAME) {
309       uintX_t Val = Dyn.getVal();
310       if (Val >= this->StringTable.size())
311         error("Invalid DT_SONAME entry");
312       this->SoName = StringRef(this->StringTable.data() + Val);
313       return;
314     }
315   }
316 }
317 
318 template <class ELFT> void SharedFile<ELFT>::parse() {
319   Elf_Sym_Range Syms = this->getNonLocalSymbols();
320   uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
321   SymbolBodies.reserve(NumSymbols);
322   for (const Elf_Sym &Sym : Syms) {
323     ErrorOr<StringRef> NameOrErr = Sym.getName(this->StringTable);
324     error(NameOrErr.getError());
325     StringRef Name = *NameOrErr;
326 
327     if (Sym.isUndefined())
328       Undefs.push_back(Name);
329     else
330       SymbolBodies.emplace_back(this, Name, Sym);
331   }
332 }
333 
334 template <typename T>
335 static std::unique_ptr<InputFile> createELFFileAux(MemoryBufferRef MB) {
336   std::unique_ptr<T> Ret = llvm::make_unique<T>(MB);
337 
338   if (!Config->FirstElf)
339     Config->FirstElf = Ret.get();
340 
341   if (Config->EKind == ELFNoneKind) {
342     Config->EKind = Ret->getELFKind();
343     Config->EMachine = Ret->getEMachine();
344   }
345 
346   return std::move(Ret);
347 }
348 
349 template <template <class> class T>
350 std::unique_ptr<InputFile> lld::elf2::createELFFile(MemoryBufferRef MB) {
351   using namespace llvm;
352 
353   std::pair<unsigned char, unsigned char> Type =
354     object::getElfArchType(MB.getBuffer());
355   if (Type.second != ELF::ELFDATA2LSB && Type.second != ELF::ELFDATA2MSB)
356     error("Invalid data encoding: " + MB.getBufferIdentifier());
357 
358   if (Type.first == ELF::ELFCLASS32) {
359     if (Type.second == ELF::ELFDATA2LSB)
360       return createELFFileAux<T<object::ELF32LE>>(MB);
361     return createELFFileAux<T<object::ELF32BE>>(MB);
362   }
363   if (Type.first == ELF::ELFCLASS64) {
364     if (Type.second == ELF::ELFDATA2LSB)
365       return createELFFileAux<T<object::ELF64LE>>(MB);
366     return createELFFileAux<T<object::ELF64BE>>(MB);
367   }
368   error("Invalid file class: " + MB.getBufferIdentifier());
369 }
370 
371 namespace lld {
372 namespace elf2 {
373 template class ELFFileBase<llvm::object::ELF32LE>;
374 template class ELFFileBase<llvm::object::ELF32BE>;
375 template class ELFFileBase<llvm::object::ELF64LE>;
376 template class ELFFileBase<llvm::object::ELF64BE>;
377 
378 template class ObjectFile<llvm::object::ELF32LE>;
379 template class ObjectFile<llvm::object::ELF32BE>;
380 template class ObjectFile<llvm::object::ELF64LE>;
381 template class ObjectFile<llvm::object::ELF64BE>;
382 
383 template class SharedFile<llvm::object::ELF32LE>;
384 template class SharedFile<llvm::object::ELF32BE>;
385 template class SharedFile<llvm::object::ELF64LE>;
386 template class SharedFile<llvm::object::ELF64BE>;
387 
388 template std::unique_ptr<InputFile> createELFFile<ObjectFile>(MemoryBufferRef);
389 template std::unique_ptr<InputFile> createELFFile<SharedFile>(MemoryBufferRef);
390 }
391 }
392