1 //===- SymbolTable.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 // Symbol table is a bag of all known symbols. We put all symbols of 11 // all input files to the symbol table. The symbol table is basically 12 // a hash table with the logic to resolve symbol name conflicts using 13 // the symbol types. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #include "SymbolTable.h" 18 #include "Config.h" 19 #include "Error.h" 20 #include "Symbols.h" 21 #include "llvm/Bitcode/ReaderWriter.h" 22 #include "llvm/Support/StringSaver.h" 23 24 using namespace llvm; 25 using namespace llvm::object; 26 using namespace llvm::ELF; 27 28 using namespace lld; 29 using namespace lld::elf; 30 31 // All input object files must be for the same architecture 32 // (e.g. it does not make sense to link x86 object files with 33 // MIPS object files.) This function checks for that error. 34 template <class ELFT> static bool isCompatible(InputFile *FileP) { 35 auto *F = dyn_cast<ELFFileBase<ELFT>>(FileP); 36 if (!F) 37 return true; 38 if (F->getELFKind() == Config->EKind && F->getEMachine() == Config->EMachine) 39 return true; 40 StringRef A = F->getName(); 41 StringRef B = Config->Emulation; 42 if (B.empty()) 43 B = Config->FirstElf->getName(); 44 error(A + " is incompatible with " + B); 45 return false; 46 } 47 48 // Add symbols in File to the symbol table. 49 template <class ELFT> 50 void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { 51 InputFile *FileP = File.get(); 52 if (!isCompatible<ELFT>(FileP)) 53 return; 54 55 // .a file 56 if (auto *F = dyn_cast<ArchiveFile>(FileP)) { 57 ArchiveFiles.emplace_back(cast<ArchiveFile>(File.release())); 58 F->parse<ELFT>(); 59 return; 60 } 61 62 // Lazy object file 63 if (auto *F = dyn_cast<LazyObjectFile>(FileP)) { 64 LazyObjectFiles.emplace_back(cast<LazyObjectFile>(File.release())); 65 F->parse<ELFT>(); 66 return; 67 } 68 69 if (Config->Trace) 70 llvm::outs() << getFilename(FileP) << "\n"; 71 72 // .so file 73 if (auto *F = dyn_cast<SharedFile<ELFT>>(FileP)) { 74 // DSOs are uniquified not by filename but by soname. 75 F->parseSoName(); 76 if (!SoNames.insert(F->getSoName()).second) 77 return; 78 79 SharedFiles.emplace_back(cast<SharedFile<ELFT>>(File.release())); 80 F->parseRest(); 81 return; 82 } 83 84 // LLVM bitcode file 85 if (auto *F = dyn_cast<BitcodeFile>(FileP)) { 86 BitcodeFiles.emplace_back(cast<BitcodeFile>(File.release())); 87 F->parse<ELFT>(ComdatGroups); 88 return; 89 } 90 91 // Regular object file 92 auto *F = cast<ObjectFile<ELFT>>(FileP); 93 ObjectFiles.emplace_back(cast<ObjectFile<ELFT>>(File.release())); 94 F->parse(ComdatGroups); 95 } 96 97 // This function is where all the optimizations of link-time 98 // optimization happens. When LTO is in use, some input files are 99 // not in native object file format but in the LLVM bitcode format. 100 // This function compiles bitcode files into a few big native files 101 // using LLVM functions and replaces bitcode symbols with the results. 102 // Because all bitcode files that consist of a program are passed 103 // to the compiler at once, it can do whole-program optimization. 104 template <class ELFT> void SymbolTable<ELFT>::addCombinedLtoObject() { 105 if (BitcodeFiles.empty()) 106 return; 107 108 // Compile bitcode files. 109 Lto.reset(new BitcodeCompiler); 110 for (const std::unique_ptr<BitcodeFile> &F : BitcodeFiles) 111 Lto->add(*F); 112 std::vector<std::unique_ptr<InputFile>> IFs = Lto->compile(); 113 114 // Replace bitcode symbols. 115 for (auto &IF : IFs) { 116 ObjectFile<ELFT> *Obj = cast<ObjectFile<ELFT>>(IF.release()); 117 118 llvm::DenseSet<StringRef> DummyGroups; 119 Obj->parse(DummyGroups); 120 ObjectFiles.emplace_back(Obj); 121 } 122 } 123 124 template <class ELFT> 125 DefinedRegular<ELFT> *SymbolTable<ELFT>::addAbsolute(StringRef Name, 126 uint8_t Visibility) { 127 return cast<DefinedRegular<ELFT>>( 128 addRegular(Name, STB_GLOBAL, Visibility)->body()); 129 } 130 131 // Add Name as an "ignored" symbol. An ignored symbol is a regular 132 // linker-synthesized defined symbol, but is only defined if needed. 133 template <class ELFT> 134 DefinedRegular<ELFT> *SymbolTable<ELFT>::addIgnored(StringRef Name, 135 uint8_t Visibility) { 136 if (!find(Name)) 137 return nullptr; 138 return addAbsolute(Name, Visibility); 139 } 140 141 // Rename SYM as __wrap_SYM. The original symbol is preserved as __real_SYM. 142 // Used to implement --wrap. 143 template <class ELFT> void SymbolTable<ELFT>::wrap(StringRef Name) { 144 SymbolBody *B = find(Name); 145 if (!B) 146 return; 147 StringSaver Saver(Alloc); 148 Symbol *Sym = B->symbol(); 149 Symbol *Real = addUndefined(Saver.save("__real_" + Name)); 150 Symbol *Wrap = addUndefined(Saver.save("__wrap_" + Name)); 151 // We rename symbols by replacing the old symbol's SymbolBody with the new 152 // symbol's SymbolBody. This causes all SymbolBody pointers referring to the 153 // old symbol to instead refer to the new symbol. 154 memcpy(Real->Body.buffer, Sym->Body.buffer, sizeof(Sym->Body)); 155 memcpy(Sym->Body.buffer, Wrap->Body.buffer, sizeof(Wrap->Body)); 156 } 157 158 static uint8_t getMinVisibility(uint8_t VA, uint8_t VB) { 159 if (VA == STV_DEFAULT) 160 return VB; 161 if (VB == STV_DEFAULT) 162 return VA; 163 return std::min(VA, VB); 164 } 165 166 // Find an existing symbol or create and insert a new one. 167 template <class ELFT> 168 std::pair<Symbol *, bool> SymbolTable<ELFT>::insert(StringRef Name) { 169 unsigned NumSyms = SymVector.size(); 170 auto P = Symtab.insert(std::make_pair(Name, NumSyms)); 171 Symbol *Sym; 172 if (P.second) { 173 Sym = new (Alloc) Symbol; 174 Sym->Binding = STB_WEAK; 175 Sym->Visibility = STV_DEFAULT; 176 Sym->IsUsedInRegularObj = false; 177 Sym->ExportDynamic = false; 178 if (Config->VersionScriptGlobalByDefault) 179 Sym->VersionId = VER_NDX_GLOBAL; 180 else 181 Sym->VersionId = VER_NDX_LOCAL; 182 SymVector.push_back(Sym); 183 } else { 184 Sym = SymVector[P.first->second]; 185 } 186 return {Sym, P.second}; 187 } 188 189 // Find an existing symbol or create and insert a new one, then apply the given 190 // attributes. 191 template <class ELFT> 192 std::pair<Symbol *, bool> 193 SymbolTable<ELFT>::insert(StringRef Name, uint8_t Type, uint8_t Visibility, 194 bool CanOmitFromDynSym, bool IsUsedInRegularObj, 195 InputFile *File) { 196 Symbol *S; 197 bool WasInserted; 198 std::tie(S, WasInserted) = insert(Name); 199 200 // Merge in the new symbol's visibility. 201 S->Visibility = getMinVisibility(S->Visibility, Visibility); 202 if (!CanOmitFromDynSym && (Config->Shared || Config->ExportDynamic)) 203 S->ExportDynamic = true; 204 if (IsUsedInRegularObj) 205 S->IsUsedInRegularObj = true; 206 if (!WasInserted && S->body()->Type != SymbolBody::UnknownType && 207 ((Type == STT_TLS) != S->body()->isTls())) 208 error("TLS attribute mismatch for symbol: " + 209 conflictMsg(S->body(), File)); 210 211 return {S, WasInserted}; 212 } 213 214 // Construct a string in the form of "Sym in File1 and File2". 215 // Used to construct an error message. 216 template <typename ELFT> 217 std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Existing, 218 InputFile *NewFile) { 219 StringRef Sym = Existing->getName(); 220 return demangle(Sym) + " in " + getFilename(Existing->getSourceFile<ELFT>()) + 221 " and " + getFilename(NewFile); 222 } 223 224 template <class ELFT> Symbol *SymbolTable<ELFT>::addUndefined(StringRef Name) { 225 return addUndefined(Name, STB_GLOBAL, STV_DEFAULT, /*Type*/ 0, 226 /*CanOmitFromDynSym*/ false, /*File*/ nullptr); 227 } 228 229 template <class ELFT> 230 Symbol *SymbolTable<ELFT>::addUndefined(StringRef Name, uint8_t Binding, 231 uint8_t StOther, uint8_t Type, 232 bool CanOmitFromDynSym, 233 InputFile *File) { 234 Symbol *S; 235 bool WasInserted; 236 std::tie(S, WasInserted) = 237 insert(Name, Type, StOther & 3, CanOmitFromDynSym, 238 /*IsUsedInRegularObj*/ !File || !isa<BitcodeFile>(File), File); 239 if (WasInserted) { 240 S->Binding = Binding; 241 replaceBody<Undefined>(S, Name, StOther, Type); 242 cast<Undefined>(S->body())->File = File; 243 return S; 244 } 245 if (Binding != STB_WEAK) { 246 if (S->body()->isShared() || S->body()->isLazy()) 247 S->Binding = Binding; 248 if (auto *SS = dyn_cast<SharedSymbol<ELFT>>(S->body())) 249 SS->File->IsUsed = true; 250 } 251 if (auto *L = dyn_cast<Lazy>(S->body())) { 252 // An undefined weak will not fetch archive members, but we have to remember 253 // its type. See also comment in addLazyArchive. 254 if (S->isWeak()) 255 L->Type = Type; 256 else if (auto F = L->getFile()) 257 addFile(std::move(F)); 258 } 259 return S; 260 } 261 262 // We have a new defined symbol with the specified binding. Return 1 if the new 263 // symbol should win, -1 if the new symbol should lose, or 0 if both symbols are 264 // strong defined symbols. 265 static int compareDefined(Symbol *S, bool WasInserted, uint8_t Binding) { 266 if (WasInserted) 267 return 1; 268 SymbolBody *Body = S->body(); 269 if (Body->isLazy() || Body->isUndefined() || Body->isShared()) 270 return 1; 271 if (Binding == STB_WEAK) 272 return -1; 273 if (S->isWeak()) 274 return 1; 275 return 0; 276 } 277 278 // We have a new non-common defined symbol with the specified binding. Return 1 279 // if the new symbol should win, -1 if the new symbol should lose, or 0 if there 280 // is a conflict. If the new symbol wins, also update the binding. 281 static int compareDefinedNonCommon(Symbol *S, bool WasInserted, uint8_t Binding) { 282 if (int Cmp = compareDefined(S, WasInserted, Binding)) { 283 if (Cmp > 0) 284 S->Binding = Binding; 285 return Cmp; 286 } 287 if (isa<DefinedCommon>(S->body())) { 288 // Non-common symbols take precedence over common symbols. 289 if (Config->WarnCommon) 290 warning("common " + S->body()->getName() + " is overridden"); 291 return 1; 292 } 293 return 0; 294 } 295 296 template <class ELFT> 297 Symbol *SymbolTable<ELFT>::addCommon(StringRef N, uint64_t Size, 298 uint64_t Alignment, uint8_t Binding, 299 uint8_t StOther, uint8_t Type, 300 InputFile *File) { 301 Symbol *S; 302 bool WasInserted; 303 std::tie(S, WasInserted) = 304 insert(N, Type, StOther & 3, /*CanOmitFromDynSym*/ false, 305 /*IsUsedInRegularObj*/ true, File); 306 int Cmp = compareDefined(S, WasInserted, Binding); 307 if (Cmp > 0) { 308 S->Binding = Binding; 309 replaceBody<DefinedCommon>(S, N, Size, Alignment, StOther, Type); 310 } else if (Cmp == 0) { 311 auto *C = dyn_cast<DefinedCommon>(S->body()); 312 if (!C) { 313 // Non-common symbols take precedence over common symbols. 314 if (Config->WarnCommon) 315 warning("common " + S->body()->getName() + " is overridden"); 316 return S; 317 } 318 319 if (Config->WarnCommon) 320 warning("multiple common of " + S->body()->getName()); 321 322 C->Size = std::max(C->Size, Size); 323 C->Alignment = std::max(C->Alignment, Alignment); 324 } 325 return S; 326 } 327 328 template <class ELFT> 329 void SymbolTable<ELFT>::reportDuplicate(SymbolBody *Existing, 330 InputFile *NewFile) { 331 std::string Msg = "duplicate symbol: " + conflictMsg(Existing, NewFile); 332 if (Config->AllowMultipleDefinition) 333 warning(Msg); 334 else 335 error(Msg); 336 } 337 338 template <typename ELFT> 339 Symbol *SymbolTable<ELFT>::addRegular(StringRef Name, const Elf_Sym &Sym, 340 InputSectionBase<ELFT> *Section) { 341 Symbol *S; 342 bool WasInserted; 343 std::tie(S, WasInserted) = 344 insert(Name, Sym.getType(), Sym.getVisibility(), 345 /*CanOmitFromDynSym*/ false, /*IsUsedInRegularObj*/ true, 346 Section ? Section->getFile() : nullptr); 347 int Cmp = compareDefinedNonCommon(S, WasInserted, Sym.getBinding()); 348 if (Cmp > 0) 349 replaceBody<DefinedRegular<ELFT>>(S, Name, Sym, Section); 350 else if (Cmp == 0) 351 reportDuplicate(S->body(), Section->getFile()); 352 return S; 353 } 354 355 template <typename ELFT> 356 Symbol *SymbolTable<ELFT>::addRegular(StringRef Name, uint8_t Binding, 357 uint8_t StOther) { 358 Symbol *S; 359 bool WasInserted; 360 std::tie(S, WasInserted) = 361 insert(Name, STT_NOTYPE, StOther & 3, /*CanOmitFromDynSym*/ false, 362 /*IsUsedInRegularObj*/ true, nullptr); 363 int Cmp = compareDefinedNonCommon(S, WasInserted, Binding); 364 if (Cmp > 0) 365 replaceBody<DefinedRegular<ELFT>>(S, Name, StOther); 366 else if (Cmp == 0) 367 reportDuplicate(S->body(), nullptr); 368 return S; 369 } 370 371 template <typename ELFT> 372 Symbol *SymbolTable<ELFT>::addSynthetic(StringRef N, 373 OutputSectionBase<ELFT> *Section, 374 uintX_t Value) { 375 Symbol *S; 376 bool WasInserted; 377 std::tie(S, WasInserted) = 378 insert(N, STT_NOTYPE, STV_HIDDEN, /*CanOmitFromDynSym*/ false, 379 /*IsUsedInRegularObj*/ true, nullptr); 380 int Cmp = compareDefinedNonCommon(S, WasInserted, STB_GLOBAL); 381 if (Cmp > 0) 382 replaceBody<DefinedSynthetic<ELFT>>(S, N, Value, Section); 383 else if (Cmp == 0) 384 reportDuplicate(S->body(), nullptr); 385 return S; 386 } 387 388 template <typename ELFT> 389 void SymbolTable<ELFT>::addShared(SharedFile<ELFT> *F, StringRef Name, 390 const Elf_Sym &Sym, 391 const typename ELFT::Verdef *Verdef) { 392 // DSO symbols do not affect visibility in the output, so we pass STV_DEFAULT 393 // as the visibility, which will leave the visibility in the symbol table 394 // unchanged. 395 Symbol *S; 396 bool WasInserted; 397 std::tie(S, WasInserted) = 398 insert(Name, Sym.getType(), STV_DEFAULT, /*CanOmitFromDynSym*/ true, 399 /*IsUsedInRegularObj*/ false, F); 400 // Make sure we preempt DSO symbols with default visibility. 401 if (Sym.getVisibility() == STV_DEFAULT) 402 S->ExportDynamic = true; 403 if (WasInserted || isa<Undefined>(S->body())) { 404 replaceBody<SharedSymbol<ELFT>>(S, F, Name, Sym, Verdef); 405 if (!S->isWeak()) 406 F->IsUsed = true; 407 } 408 } 409 410 template <class ELFT> 411 Symbol *SymbolTable<ELFT>::addBitcode(StringRef Name, bool IsWeak, 412 uint8_t StOther, uint8_t Type, 413 bool CanOmitFromDynSym, BitcodeFile *F) { 414 Symbol *S; 415 bool WasInserted; 416 std::tie(S, WasInserted) = insert(Name, Type, StOther & 3, CanOmitFromDynSym, 417 /*IsUsedInRegularObj*/ false, F); 418 int Cmp = 419 compareDefinedNonCommon(S, WasInserted, IsWeak ? STB_WEAK : STB_GLOBAL); 420 if (Cmp > 0) 421 replaceBody<DefinedBitcode>(S, Name, StOther, Type, F); 422 else if (Cmp == 0) 423 reportDuplicate(S->body(), F); 424 return S; 425 } 426 427 template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name) { 428 auto It = Symtab.find(Name); 429 if (It == Symtab.end()) 430 return nullptr; 431 return SymVector[It->second]->body(); 432 } 433 434 template <class ELFT> 435 void SymbolTable<ELFT>::addLazyArchive( 436 ArchiveFile *F, const llvm::object::Archive::Symbol Sym) { 437 Symbol *S; 438 bool WasInserted; 439 std::tie(S, WasInserted) = insert(Sym.getName()); 440 if (WasInserted) { 441 replaceBody<LazyArchive>(S, *F, Sym, SymbolBody::UnknownType); 442 return; 443 } 444 if (!S->body()->isUndefined()) 445 return; 446 447 // Weak undefined symbols should not fetch members from archives. If we were 448 // to keep old symbol we would not know that an archive member was available 449 // if a strong undefined symbol shows up afterwards in the link. If a strong 450 // undefined symbol never shows up, this lazy symbol will get to the end of 451 // the link and must be treated as the weak undefined one. We already marked 452 // this symbol as used when we added it to the symbol table, but we also need 453 // to preserve its type. FIXME: Move the Type field to Symbol. 454 if (S->isWeak()) { 455 replaceBody<LazyArchive>(S, *F, Sym, S->body()->Type); 456 return; 457 } 458 MemoryBufferRef MBRef = F->getMember(&Sym); 459 if (!MBRef.getBuffer().empty()) 460 addFile(createObjectFile(MBRef, F->getName())); 461 } 462 463 template <class ELFT> 464 void SymbolTable<ELFT>::addLazyObject(StringRef Name, LazyObjectFile &Obj) { 465 Symbol *S; 466 bool WasInserted; 467 std::tie(S, WasInserted) = insert(Name); 468 if (WasInserted) { 469 replaceBody<LazyObject>(S, Name, Obj, SymbolBody::UnknownType); 470 return; 471 } 472 if (!S->body()->isUndefined()) 473 return; 474 475 // See comment for addLazyArchive above. 476 if (S->isWeak()) { 477 replaceBody<LazyObject>(S, Name, Obj, S->body()->Type); 478 } else { 479 MemoryBufferRef MBRef = Obj.getBuffer(); 480 if (!MBRef.getBuffer().empty()) 481 addFile(createObjectFile(MBRef)); 482 } 483 } 484 485 // Process undefined (-u) flags by loading lazy symbols named by those flags. 486 template <class ELFT> void SymbolTable<ELFT>::scanUndefinedFlags() { 487 for (StringRef S : Config->Undefined) 488 if (auto *L = dyn_cast_or_null<Lazy>(find(S))) 489 if (std::unique_ptr<InputFile> File = L->getFile()) 490 addFile(std::move(File)); 491 } 492 493 // This function takes care of the case in which shared libraries depend on 494 // the user program (not the other way, which is usual). Shared libraries 495 // may have undefined symbols, expecting that the user program provides 496 // the definitions for them. An example is BSD's __progname symbol. 497 // We need to put such symbols to the main program's .dynsym so that 498 // shared libraries can find them. 499 // Except this, we ignore undefined symbols in DSOs. 500 template <class ELFT> void SymbolTable<ELFT>::scanShlibUndefined() { 501 for (std::unique_ptr<SharedFile<ELFT>> &File : SharedFiles) 502 for (StringRef U : File->getUndefinedSymbols()) 503 if (SymbolBody *Sym = find(U)) 504 if (Sym->isDefined()) 505 Sym->symbol()->ExportDynamic = true; 506 } 507 508 // This function process the dynamic list option by marking all the symbols 509 // to be exported in the dynamic table. 510 template <class ELFT> void SymbolTable<ELFT>::scanDynamicList() { 511 for (StringRef S : Config->DynamicList) 512 if (SymbolBody *B = find(S)) 513 B->symbol()->ExportDynamic = true; 514 } 515 516 // This function processes the --version-script option by marking all global 517 // symbols with the VersionScriptGlobal flag, which acts as a filter on the 518 // dynamic symbol table. 519 template <class ELFT> void SymbolTable<ELFT>::scanVersionScript() { 520 // If version script does not contain versions declarations, 521 // we just should mark global symbols. 522 if (!Config->VersionScriptGlobals.empty()) { 523 for (StringRef S : Config->VersionScriptGlobals) 524 if (SymbolBody *B = find(S)) 525 B->symbol()->VersionId = VER_NDX_GLOBAL; 526 return; 527 } 528 529 // If we have symbols version declarations, we should 530 // assign version references for each symbol. 531 size_t I = 2; 532 for (Version &V : Config->SymbolVersions) { 533 for (StringRef Name : V.Globals) 534 if (SymbolBody *B = find(Name)) 535 B->symbol()->VersionId = I; 536 ++I; 537 } 538 } 539 540 template class elf::SymbolTable<ELF32LE>; 541 template class elf::SymbolTable<ELF32BE>; 542 template class elf::SymbolTable<ELF64LE>; 543 template class elf::SymbolTable<ELF64BE>; 544