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/Support/StringSaver.h" 22 23 using namespace llvm; 24 using namespace llvm::object; 25 using namespace llvm::ELF; 26 27 using namespace lld; 28 using namespace lld::elf2; 29 30 // All input object files must be for the same architecture 31 // (e.g. it does not make sense to link x86 object files with 32 // MIPS object files.) This function checks for that error. 33 template <class ELFT> 34 static void checkCompatibility(InputFile *FileP) { 35 auto *F = dyn_cast<ELFFileBase<ELFT>>(FileP); 36 if (!F) 37 return; 38 if (F->getELFKind() == Config->EKind && F->getEMachine() == Config->EMachine) 39 return; 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 } 46 47 // Add symbols in File to the symbol table. 48 template <class ELFT> 49 void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { 50 InputFile *FileP = File.get(); 51 checkCompatibility<ELFT>(FileP); 52 53 // .a file 54 if (auto *F = dyn_cast<ArchiveFile>(FileP)) { 55 ArchiveFiles.emplace_back(cast<ArchiveFile>(File.release())); 56 F->parse(); 57 for (Lazy &Sym : F->getLazySymbols()) 58 addLazy(&Sym); 59 return; 60 } 61 62 // .so file 63 if (auto *F = dyn_cast<SharedFile<ELFT>>(FileP)) { 64 // DSOs are uniquified not by filename but by soname. 65 F->parseSoName(); 66 if (!SoNames.insert(F->getSoName()).second) 67 return; 68 69 SharedFiles.emplace_back(cast<SharedFile<ELFT>>(File.release())); 70 F->parseRest(); 71 for (SharedSymbol<ELFT> &B : F->getSharedSymbols()) 72 resolve(&B); 73 return; 74 } 75 76 // .o file 77 auto *F = cast<ObjectFile<ELFT>>(FileP); 78 ObjectFiles.emplace_back(cast<ObjectFile<ELFT>>(File.release())); 79 F->parse(ComdatGroups); 80 for (SymbolBody *B : F->getSymbols()) 81 resolve(B); 82 } 83 84 // Add an undefined symbol. 85 template <class ELFT> 86 SymbolBody *SymbolTable<ELFT>::addUndefined(StringRef Name) { 87 auto *Sym = new (Alloc) Undefined(Name, false, STV_DEFAULT, false); 88 resolve(Sym); 89 return Sym; 90 } 91 92 // Add an undefined symbol. Unlike addUndefined, that symbol 93 // doesn't have to be resolved, thus "opt" (optional). 94 template <class ELFT> 95 SymbolBody *SymbolTable<ELFT>::addUndefinedOpt(StringRef Name) { 96 auto *Sym = new (Alloc) Undefined(Name, false, STV_HIDDEN, true); 97 resolve(Sym); 98 return Sym; 99 } 100 101 template <class ELFT> 102 SymbolBody *SymbolTable<ELFT>::addAbsolute(StringRef Name, Elf_Sym &ESym) { 103 // Pass nullptr because absolute symbols have no corresponding input sections. 104 auto *Sym = new (Alloc) DefinedRegular<ELFT>(Name, ESym, nullptr); 105 resolve(Sym); 106 return Sym; 107 } 108 109 template <class ELFT> 110 SymbolBody *SymbolTable<ELFT>::addSynthetic(StringRef Name, 111 OutputSectionBase<ELFT> &Section, 112 uintX_t Value) { 113 auto *Sym = new (Alloc) DefinedSynthetic<ELFT>(Name, Value, Section); 114 resolve(Sym); 115 return Sym; 116 } 117 118 // Add Name as an "ignored" symbol. An ignored symbol is a regular 119 // linker-synthesized defined symbol, but it is not recorded to the output 120 // file's symbol table. Such symbols are useful for some linker-defined symbols. 121 template <class ELFT> 122 SymbolBody *SymbolTable<ELFT>::addIgnored(StringRef Name) { 123 return addAbsolute(Name, ElfSym<ELFT>::IgnoredWeak); 124 } 125 126 // The 'strong' variant of the addIgnored. Adds symbol which has a global 127 // binding and cannot be substituted. 128 template <class ELFT> 129 SymbolBody *SymbolTable<ELFT>::addIgnoredStrong(StringRef Name) { 130 return addAbsolute(Name, ElfSym<ELFT>::Ignored); 131 } 132 133 // Rename SYM as __wrap_SYM. The original symbol is preserved as __real_SYM. 134 // Used to implement --wrap. 135 template <class ELFT> void SymbolTable<ELFT>::wrap(StringRef Name) { 136 if (Symtab.count(Name) == 0) 137 return; 138 StringSaver Saver(Alloc); 139 Symbol *Sym = addUndefined(Name)->getSymbol(); 140 Symbol *Real = addUndefined(Saver.save("__real_" + Name))->getSymbol(); 141 Symbol *Wrap = addUndefined(Saver.save("__wrap_" + Name))->getSymbol(); 142 Real->Body = Sym->Body; 143 Sym->Body = Wrap->Body; 144 } 145 146 // Returns a file from which symbol B was created. 147 // If B does not belong to any file, returns a nullptr. 148 template <class ELFT> 149 ELFFileBase<ELFT> *SymbolTable<ELFT>::findFile(SymbolBody *B) { 150 for (const std::unique_ptr<ObjectFile<ELFT>> &F : ObjectFiles) { 151 ArrayRef<SymbolBody *> Syms = F->getSymbols(); 152 if (std::find(Syms.begin(), Syms.end(), B) != Syms.end()) 153 return F.get(); 154 } 155 return nullptr; 156 } 157 158 // Construct a string in the form of "Sym in File1 and File2". 159 // Used to construct an error message. 160 template <class ELFT> 161 std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Old, SymbolBody *New) { 162 ELFFileBase<ELFT> *OldFile = findFile(Old); 163 ELFFileBase<ELFT> *NewFile = findFile(New); 164 165 StringRef Sym = Old->getName(); 166 StringRef F1 = OldFile ? OldFile->getName() : "(internal)"; 167 StringRef F2 = NewFile ? NewFile->getName() : "(internal)"; 168 return (Sym + " in " + F1 + " and " + F2).str(); 169 } 170 171 // This function resolves conflicts if there's an existing symbol with 172 // the same name. Decisions are made based on symbol type. 173 template <class ELFT> void SymbolTable<ELFT>::resolve(SymbolBody *New) { 174 Symbol *Sym = insert(New); 175 if (Sym->Body == New) 176 return; 177 178 SymbolBody *Existing = Sym->Body; 179 180 if (Lazy *L = dyn_cast<Lazy>(Existing)) { 181 if (auto *Undef = dyn_cast<Undefined>(New)) { 182 addMemberFile(Undef, L); 183 return; 184 } 185 // Found a definition for something also in an archive. 186 // Ignore the archive definition. 187 Sym->Body = New; 188 return; 189 } 190 191 if (New->isTls() != Existing->isTls()) 192 error("TLS attribute mismatch for symbol: " + conflictMsg(Existing, New)); 193 194 // compare() returns -1, 0, or 1 if the lhs symbol is less preferable, 195 // equivalent (conflicting), or more preferable, respectively. 196 int Comp = Existing->compare<ELFT>(New); 197 if (Comp == 0) { 198 std::string S = "duplicate symbol: " + conflictMsg(Existing, New); 199 if (!Config->AllowMultipleDefinition) 200 error(S); 201 warning(S); 202 return; 203 } 204 if (Comp < 0) 205 Sym->Body = New; 206 } 207 208 // Find an existing symbol or create and insert a new one. 209 template <class ELFT> Symbol *SymbolTable<ELFT>::insert(SymbolBody *New) { 210 StringRef Name = New->getName(); 211 Symbol *&Sym = Symtab[Name]; 212 if (!Sym) 213 Sym = new (Alloc) Symbol{New}; 214 New->setBackref(Sym); 215 return Sym; 216 } 217 218 template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name) { 219 auto It = Symtab.find(Name); 220 if (It == Symtab.end()) 221 return nullptr; 222 return It->second->Body; 223 } 224 225 template <class ELFT> void SymbolTable<ELFT>::addLazy(Lazy *L) { 226 Symbol *Sym = insert(L); 227 if (Sym->Body == L) 228 return; 229 if (auto *Undef = dyn_cast<Undefined>(Sym->Body)) { 230 Sym->Body = L; 231 addMemberFile(Undef, L); 232 } 233 } 234 235 template <class ELFT> 236 void SymbolTable<ELFT>::addMemberFile(Undefined *Undef, Lazy *L) { 237 // Weak undefined symbols should not fetch members from archives. 238 // If we were to keep old symbol we would not know that an archive member was 239 // available if a strong undefined symbol shows up afterwards in the link. 240 // If a strong undefined symbol never shows up, this lazy symbol will 241 // get to the end of the link and must be treated as the weak undefined one. 242 // We set UsedInRegularObj in a similar way to what is done with shared 243 // symbols and mark it as weak to reduce how many special cases are needed. 244 if (Undef->isWeak()) { 245 L->setUsedInRegularObj(); 246 L->setWeak(); 247 return; 248 } 249 250 // Fetch a member file that has the definition for L. 251 // getMember returns nullptr if the member was already read from the library. 252 if (std::unique_ptr<InputFile> File = L->getMember()) 253 addFile(std::move(File)); 254 } 255 256 // This function takes care of the case in which shared libraries depend on 257 // the user program (not the other way, which is usual). Shared libraries 258 // may have undefined symbols, expecting that the user program provides 259 // the definitions for them. An example is BSD's __progname symbol. 260 // We need to put such symbols to the main program's .dynsym so that 261 // shared libraries can find them. 262 // Except this, we ignore undefined symbols in DSOs. 263 template <class ELFT> void SymbolTable<ELFT>::scanShlibUndefined() { 264 for (std::unique_ptr<SharedFile<ELFT>> &File : SharedFiles) 265 for (StringRef U : File->getUndefinedSymbols()) 266 if (SymbolBody *Sym = find(U)) 267 if (Sym->isDefined()) 268 Sym->setUsedInDynamicReloc(); 269 } 270 271 template class elf2::SymbolTable<ELF32LE>; 272 template class elf2::SymbolTable<ELF32BE>; 273 template class elf2::SymbolTable<ELF64LE>; 274 template class elf2::SymbolTable<ELF64BE>; 275