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