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 Sym->VersionScriptGlobal = !Config->VersionScript; 179 SymVector.push_back(Sym); 180 } else { 181 Sym = SymVector[P.first->second]; 182 } 183 return {Sym, P.second}; 184 } 185 186 // Find an existing symbol or create and insert a new one, then apply the given 187 // attributes. 188 template <class ELFT> 189 std::pair<Symbol *, bool> 190 SymbolTable<ELFT>::insert(StringRef Name, uint8_t Type, uint8_t Visibility, 191 bool CanOmitFromDynSym, bool IsUsedInRegularObj, 192 InputFile *File) { 193 Symbol *S; 194 bool WasInserted; 195 std::tie(S, WasInserted) = insert(Name); 196 197 // Merge in the new symbol's visibility. 198 S->Visibility = getMinVisibility(S->Visibility, Visibility); 199 if (!CanOmitFromDynSym && (Config->Shared || Config->ExportDynamic)) 200 S->ExportDynamic = true; 201 if (IsUsedInRegularObj) 202 S->IsUsedInRegularObj = true; 203 if (!WasInserted && S->body()->Type != SymbolBody::UnknownType && 204 ((Type == STT_TLS) != S->body()->isTls())) 205 error("TLS attribute mismatch for symbol: " + 206 conflictMsg(S->body(), File)); 207 208 return {S, WasInserted}; 209 } 210 211 // Construct a string in the form of "Sym in File1 and File2". 212 // Used to construct an error message. 213 template <typename ELFT> 214 std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Existing, 215 InputFile *NewFile) { 216 StringRef Sym = Existing->getName(); 217 return demangle(Sym) + " in " + getFilename(Existing->getSourceFile<ELFT>()) + 218 " and " + getFilename(NewFile); 219 } 220 221 template <class ELFT> Symbol *SymbolTable<ELFT>::addUndefined(StringRef Name) { 222 return addUndefined(Name, STB_GLOBAL, STV_DEFAULT, /*Type*/ 0, 223 /*File*/ nullptr); 224 } 225 226 template <class ELFT> 227 Symbol *SymbolTable<ELFT>::addUndefined(StringRef Name, uint8_t Binding, 228 uint8_t StOther, uint8_t Type, 229 InputFile *File) { 230 Symbol *S; 231 bool WasInserted; 232 std::tie(S, WasInserted) = 233 insert(Name, Type, StOther & 3, /*CanOmitFromDynSym*/ false, 234 /*IsUsedInRegularObj*/ !File || !isa<BitcodeFile>(File), File); 235 if (WasInserted) { 236 S->Binding = Binding; 237 replaceBody<Undefined>(S, Name, StOther, Type); 238 cast<Undefined>(S->body())->File = File; 239 return S; 240 } 241 if (Binding != STB_WEAK && 242 (S->body()->isShared() || S->body()->isLazy())) 243 S->Binding = Binding; 244 if (auto *L = dyn_cast<Lazy>(S->body())) { 245 // An undefined weak will not fetch archive members, but we have to remember 246 // its type. See also comment in addLazyArchive. 247 if (S->isWeak()) 248 L->Type = Type; 249 else if (auto F = L->getFile()) 250 addFile(std::move(F)); 251 } 252 return S; 253 } 254 255 // We have a new defined symbol with the specified binding. Return 1 if the new 256 // symbol should win, -1 if the new symbol should lose, or 0 if both symbols are 257 // strong defined symbols. 258 static int compareDefined(Symbol *S, bool WasInserted, uint8_t Binding) { 259 if (WasInserted) 260 return 1; 261 SymbolBody *Body = S->body(); 262 if (Body->isLazy() || Body->isUndefined() || Body->isShared()) 263 return 1; 264 if (Binding == STB_WEAK) 265 return -1; 266 if (S->isWeak()) 267 return 1; 268 return 0; 269 } 270 271 // We have a new non-common defined symbol with the specified binding. Return 1 272 // if the new symbol should win, -1 if the new symbol should lose, or 0 if there 273 // is a conflict. If the new symbol wins, also update the binding. 274 static int compareDefinedNonCommon(Symbol *S, bool WasInserted, uint8_t Binding) { 275 if (int Cmp = compareDefined(S, WasInserted, Binding)) { 276 if (Cmp > 0) 277 S->Binding = Binding; 278 return Cmp; 279 } 280 if (isa<DefinedCommon>(S->body())) { 281 // Non-common symbols take precedence over common symbols. 282 if (Config->WarnCommon) 283 warning("common " + S->body()->getName() + " is overridden"); 284 return 1; 285 } 286 return 0; 287 } 288 289 template <class ELFT> 290 Symbol *SymbolTable<ELFT>::addCommon(StringRef N, uint64_t Size, 291 uint64_t Alignment, uint8_t Binding, 292 uint8_t StOther, uint8_t Type, 293 InputFile *File) { 294 Symbol *S; 295 bool WasInserted; 296 std::tie(S, WasInserted) = 297 insert(N, Type, StOther & 3, /*CanOmitFromDynSym*/ false, 298 /*IsUsedInRegularObj*/ true, File); 299 int Cmp = compareDefined(S, WasInserted, Binding); 300 if (Cmp > 0) { 301 S->Binding = Binding; 302 replaceBody<DefinedCommon>(S, N, Size, Alignment, StOther, Type); 303 } else if (Cmp == 0) { 304 auto *C = dyn_cast<DefinedCommon>(S->body()); 305 if (!C) { 306 // Non-common symbols take precedence over common symbols. 307 if (Config->WarnCommon) 308 warning("common " + S->body()->getName() + " is overridden"); 309 return S; 310 } 311 312 if (Config->WarnCommon) 313 warning("multiple common of " + S->body()->getName()); 314 315 C->Size = std::max(C->Size, Size); 316 C->Alignment = std::max(C->Alignment, Alignment); 317 } 318 return S; 319 } 320 321 template <class ELFT> 322 void SymbolTable<ELFT>::reportDuplicate(SymbolBody *Existing, 323 InputFile *NewFile) { 324 std::string Msg = "duplicate symbol: " + conflictMsg(Existing, NewFile); 325 if (Config->AllowMultipleDefinition) 326 warning(Msg); 327 else 328 error(Msg); 329 } 330 331 template <typename ELFT> 332 Symbol *SymbolTable<ELFT>::addRegular(StringRef Name, const Elf_Sym &Sym, 333 InputSectionBase<ELFT> *Section) { 334 Symbol *S; 335 bool WasInserted; 336 std::tie(S, WasInserted) = 337 insert(Name, Sym.getType(), Sym.getVisibility(), 338 /*CanOmitFromDynSym*/ false, /*IsUsedInRegularObj*/ true, 339 Section ? Section->getFile() : nullptr); 340 int Cmp = compareDefinedNonCommon(S, WasInserted, Sym.getBinding()); 341 if (Cmp > 0) 342 replaceBody<DefinedRegular<ELFT>>(S, Name, Sym, Section); 343 else if (Cmp == 0) 344 reportDuplicate(S->body(), Section->getFile()); 345 return S; 346 } 347 348 template <typename ELFT> 349 Symbol *SymbolTable<ELFT>::addRegular(StringRef Name, uint8_t Binding, 350 uint8_t StOther) { 351 Symbol *S; 352 bool WasInserted; 353 std::tie(S, WasInserted) = 354 insert(Name, STT_NOTYPE, StOther & 3, /*CanOmitFromDynSym*/ false, 355 /*IsUsedInRegularObj*/ true, nullptr); 356 int Cmp = compareDefinedNonCommon(S, WasInserted, Binding); 357 if (Cmp > 0) 358 replaceBody<DefinedRegular<ELFT>>(S, Name, StOther); 359 else if (Cmp == 0) 360 reportDuplicate(S->body(), nullptr); 361 return S; 362 } 363 364 template <typename ELFT> 365 Symbol *SymbolTable<ELFT>::addSynthetic(StringRef N, 366 OutputSectionBase<ELFT> *Section, 367 uintX_t Value) { 368 Symbol *S; 369 bool WasInserted; 370 std::tie(S, WasInserted) = 371 insert(N, STT_NOTYPE, STV_HIDDEN, /*CanOmitFromDynSym*/ false, 372 /*IsUsedInRegularObj*/ true, nullptr); 373 int Cmp = compareDefinedNonCommon(S, WasInserted, STB_GLOBAL); 374 if (Cmp > 0) 375 replaceBody<DefinedSynthetic<ELFT>>(S, N, Value, Section); 376 else if (Cmp == 0) 377 reportDuplicate(S->body(), nullptr); 378 return S; 379 } 380 381 template <typename ELFT> 382 void SymbolTable<ELFT>::addShared(SharedFile<ELFT> *F, StringRef Name, 383 const Elf_Sym &Sym, 384 const typename ELFT::Verdef *Verdef) { 385 // DSO symbols do not affect visibility in the output, so we pass STV_DEFAULT 386 // as the visibility, which will leave the visibility in the symbol table 387 // unchanged. 388 Symbol *S; 389 bool WasInserted; 390 std::tie(S, WasInserted) = 391 insert(Name, Sym.getType(), STV_DEFAULT, /*CanOmitFromDynSym*/ true, 392 /*IsUsedInRegularObj*/ false, F); 393 // Make sure we preempt DSO symbols with default visibility. 394 if (Sym.getVisibility() == STV_DEFAULT) 395 S->ExportDynamic = true; 396 if (WasInserted || isa<Undefined>(S->body())) 397 replaceBody<SharedSymbol<ELFT>>(S, F, Name, Sym, Verdef); 398 } 399 400 template <class ELFT> 401 Symbol *SymbolTable<ELFT>::addBitcode(StringRef Name, bool IsWeak, 402 uint8_t StOther, uint8_t Type, 403 bool CanOmitFromDynSym, BitcodeFile *F) { 404 Symbol *S; 405 bool WasInserted; 406 std::tie(S, WasInserted) = insert(Name, Type, StOther & 3, CanOmitFromDynSym, 407 /*IsUsedInRegularObj*/ false, F); 408 int Cmp = 409 compareDefinedNonCommon(S, WasInserted, IsWeak ? STB_WEAK : STB_GLOBAL); 410 if (Cmp > 0) 411 replaceBody<DefinedBitcode>(S, Name, StOther, Type, F); 412 else if (Cmp == 0) 413 reportDuplicate(S->body(), F); 414 return S; 415 } 416 417 template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name) { 418 auto It = Symtab.find(Name); 419 if (It == Symtab.end()) 420 return nullptr; 421 return SymVector[It->second]->body(); 422 } 423 424 template <class ELFT> 425 void SymbolTable<ELFT>::addLazyArchive( 426 ArchiveFile *F, const llvm::object::Archive::Symbol Sym) { 427 Symbol *S; 428 bool WasInserted; 429 std::tie(S, WasInserted) = insert(Sym.getName()); 430 if (WasInserted) { 431 replaceBody<LazyArchive>(S, F, Sym, SymbolBody::UnknownType); 432 return; 433 } 434 if (!S->body()->isUndefined()) 435 return; 436 437 // Weak undefined symbols should not fetch members from archives. If we were 438 // to keep old symbol we would not know that an archive member was available 439 // if a strong undefined symbol shows up afterwards in the link. If a strong 440 // undefined symbol never shows up, this lazy symbol will get to the end of 441 // the link and must be treated as the weak undefined one. We already marked 442 // this symbol as used when we added it to the symbol table, but we also need 443 // to preserve its type. FIXME: Move the Type field to Symbol. 444 if (S->isWeak()) { 445 replaceBody<LazyArchive>(S, F, Sym, S->body()->Type); 446 return; 447 } 448 MemoryBufferRef MBRef = F->getMember(&Sym); 449 if (!MBRef.getBuffer().empty()) 450 addFile(createObjectFile(MBRef, F->getName())); 451 } 452 453 template <class ELFT> 454 void SymbolTable<ELFT>::addLazyObject(StringRef Name, MemoryBufferRef MBRef) { 455 Symbol *S; 456 bool WasInserted; 457 std::tie(S, WasInserted) = insert(Name); 458 if (WasInserted) { 459 replaceBody<LazyObject>(S, Name, MBRef, SymbolBody::UnknownType); 460 return; 461 } 462 if (!S->body()->isUndefined()) 463 return; 464 465 // See comment for addLazyArchive above. 466 if (S->isWeak()) 467 replaceBody<LazyObject>(S, Name, MBRef, S->body()->Type); 468 else 469 addFile(createObjectFile(MBRef)); 470 } 471 472 // Process undefined (-u) flags by loading lazy symbols named by those flags. 473 template <class ELFT> void SymbolTable<ELFT>::scanUndefinedFlags() { 474 for (StringRef S : Config->Undefined) 475 if (auto *L = dyn_cast_or_null<Lazy>(find(S))) 476 if (std::unique_ptr<InputFile> File = L->getFile()) 477 addFile(std::move(File)); 478 } 479 480 // This function takes care of the case in which shared libraries depend on 481 // the user program (not the other way, which is usual). Shared libraries 482 // may have undefined symbols, expecting that the user program provides 483 // the definitions for them. An example is BSD's __progname symbol. 484 // We need to put such symbols to the main program's .dynsym so that 485 // shared libraries can find them. 486 // Except this, we ignore undefined symbols in DSOs. 487 template <class ELFT> void SymbolTable<ELFT>::scanShlibUndefined() { 488 for (std::unique_ptr<SharedFile<ELFT>> &File : SharedFiles) 489 for (StringRef U : File->getUndefinedSymbols()) 490 if (SymbolBody *Sym = find(U)) 491 if (Sym->isDefined()) 492 Sym->symbol()->ExportDynamic = true; 493 } 494 495 // This function process the dynamic list option by marking all the symbols 496 // to be exported in the dynamic table. 497 template <class ELFT> void SymbolTable<ELFT>::scanDynamicList() { 498 for (StringRef S : Config->DynamicList) 499 if (SymbolBody *B = find(S)) 500 B->symbol()->ExportDynamic = true; 501 } 502 503 // This function processes the --version-script option by marking all global 504 // symbols with the VersionScriptGlobal flag, which acts as a filter on the 505 // dynamic symbol table. 506 template <class ELFT> void SymbolTable<ELFT>::scanVersionScript() { 507 for (StringRef S : Config->VersionScriptGlobals) 508 if (SymbolBody *B = find(S)) 509 B->symbol()->VersionScriptGlobal = true; 510 } 511 512 template class elf::SymbolTable<ELF32LE>; 513 template class elf::SymbolTable<ELF32BE>; 514 template class elf::SymbolTable<ELF64LE>; 515 template class elf::SymbolTable<ELF64BE>; 516