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