blob: 7da4e2cd96889cbaa9ccc19aada5c02a5c8c1279 [file] [log] [blame]
Michael J. Spencer84487f12015-07-24 21:03:07 +00001//===- 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//===----------------------------------------------------------------------===//
Rui Ueyama34f29242015-10-13 19:51:57 +00009//
10// Symbol table is a bag of all known symbols. We put all symbols of
Rui Ueyamac9559d92016-01-05 20:47:37 +000011// all input files to the symbol table. The symbol table is basically
Rui Ueyama34f29242015-10-13 19:51:57 +000012// a hash table with the logic to resolve symbol name conflicts using
13// the symbol types.
14//
15//===----------------------------------------------------------------------===//
Michael J. Spencer84487f12015-07-24 21:03:07 +000016
17#include "SymbolTable.h"
Rafael Espindola4340aad2015-09-11 22:42:45 +000018#include "Config.h"
Rafael Espindola192e1fa2015-08-06 15:08:23 +000019#include "Error.h"
Michael J. Spencer84487f12015-07-24 21:03:07 +000020#include "Symbols.h"
Rui Ueyamadeb15402016-01-07 17:20:07 +000021#include "llvm/Support/StringSaver.h"
Michael J. Spencer84487f12015-07-24 21:03:07 +000022
23using namespace llvm;
Rafael Espindoladaa92a62015-08-31 01:16:19 +000024using namespace llvm::object;
Rafael Espindola01205f72015-09-22 18:19:46 +000025using namespace llvm::ELF;
Michael J. Spencer84487f12015-07-24 21:03:07 +000026
27using namespace lld;
28using namespace lld::elf2;
29
Rui Ueyamac9559d92016-01-05 20:47:37 +000030// 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.
Rui Ueyama16ba6692016-01-29 19:41:13 +000033template <class ELFT> static bool isCompatible(InputFile *FileP) {
Rui Ueyama25b44c92015-12-16 23:31:22 +000034 auto *F = dyn_cast<ELFFileBase<ELFT>>(FileP);
35 if (!F)
Rui Ueyama16ba6692016-01-29 19:41:13 +000036 return true;
Rui Ueyama25b44c92015-12-16 23:31:22 +000037 if (F->getELFKind() == Config->EKind && F->getEMachine() == Config->EMachine)
Rui Ueyama16ba6692016-01-29 19:41:13 +000038 return true;
Rui Ueyama25b44c92015-12-16 23:31:22 +000039 StringRef A = F->getName();
40 StringRef B = Config->Emulation;
41 if (B.empty())
42 B = Config->FirstElf->getName();
Rui Ueyama16ba6692016-01-29 19:41:13 +000043 error(A + " is incompatible with " + B);
44 return false;
Rui Ueyama25b44c92015-12-16 23:31:22 +000045}
46
Rui Ueyamac9559d92016-01-05 20:47:37 +000047// Add symbols in File to the symbol table.
Rui Ueyama25b44c92015-12-16 23:31:22 +000048template <class ELFT>
Rui Ueyama3ce825e2015-10-09 21:07:25 +000049void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) {
Rafael Espindola21f7bd42015-12-23 14:35:51 +000050 InputFile *FileP = File.get();
Rui Ueyama16ba6692016-01-29 19:41:13 +000051 if (!isCompatible<ELFT>(FileP))
52 return;
Rafael Espindola525914d2015-10-11 03:36:49 +000053
Rui Ueyama89575742015-12-16 22:59:13 +000054 // .a file
55 if (auto *F = dyn_cast<ArchiveFile>(FileP)) {
Rafael Espindola21f7bd42015-12-23 14:35:51 +000056 ArchiveFiles.emplace_back(cast<ArchiveFile>(File.release()));
Rui Ueyama89575742015-12-16 22:59:13 +000057 F->parse();
58 for (Lazy &Sym : F->getLazySymbols())
Michael J. Spencer1b348a62015-09-04 22:28:10 +000059 addLazy(&Sym);
60 return;
61 }
Rui Ueyama3d451792015-10-12 18:03:21 +000062
Rui Ueyama89575742015-12-16 22:59:13 +000063 // .so file
64 if (auto *F = dyn_cast<SharedFile<ELFT>>(FileP)) {
65 // DSOs are uniquified not by filename but by soname.
66 F->parseSoName();
Rui Ueyama131e0ff2016-01-08 22:17:42 +000067 if (!SoNames.insert(F->getSoName()).second)
Rafael Espindola6a3b5de2015-10-01 19:52:48 +000068 return;
Rui Ueyama89575742015-12-16 22:59:13 +000069
Rafael Espindola21f7bd42015-12-23 14:35:51 +000070 SharedFiles.emplace_back(cast<SharedFile<ELFT>>(File.release()));
Rui Ueyama7c713312016-01-06 01:56:36 +000071 F->parseRest();
Rui Ueyama89575742015-12-16 22:59:13 +000072 for (SharedSymbol<ELFT> &B : F->getSharedSymbols())
73 resolve(&B);
74 return;
Rafael Espindola6a3b5de2015-10-01 19:52:48 +000075 }
Rui Ueyama89575742015-12-16 22:59:13 +000076
77 // .o file
78 auto *F = cast<ObjectFile<ELFT>>(FileP);
Rafael Espindola21f7bd42015-12-23 14:35:51 +000079 ObjectFiles.emplace_back(cast<ObjectFile<ELFT>>(File.release()));
Rui Ueyama52d3b672016-01-06 02:06:33 +000080 F->parse(ComdatGroups);
Rui Ueyama89575742015-12-16 22:59:13 +000081 for (SymbolBody *B : F->getSymbols())
82 resolve(B);
Michael J. Spencer84487f12015-07-24 21:03:07 +000083}
84
Rui Ueyama01a65b12015-12-24 10:37:32 +000085// Add an undefined symbol.
Rui Ueyamaff777682015-10-09 21:12:40 +000086template <class ELFT>
87SymbolBody *SymbolTable<ELFT>::addUndefined(StringRef Name) {
Rafael Espindola5d7593b2015-12-22 23:00:50 +000088 auto *Sym = new (Alloc) Undefined(Name, false, STV_DEFAULT, false);
Rui Ueyamaff777682015-10-09 21:12:40 +000089 resolve(Sym);
90 return Sym;
Rafael Espindola1d6063e2015-09-22 21:24:52 +000091}
92
Rui Ueyama01a65b12015-12-24 10:37:32 +000093// Add an undefined symbol. Unlike addUndefined, that symbol
94// doesn't have to be resolved, thus "opt" (optional).
Rui Ueyamaff777682015-10-09 21:12:40 +000095template <class ELFT>
96SymbolBody *SymbolTable<ELFT>::addUndefinedOpt(StringRef Name) {
Rafael Espindola5d7593b2015-12-22 23:00:50 +000097 auto *Sym = new (Alloc) Undefined(Name, false, STV_HIDDEN, true);
Rui Ueyamaff777682015-10-09 21:12:40 +000098 resolve(Sym);
99 return Sym;
Denis Protivensky22220d52015-10-05 09:43:57 +0000100}
101
Rafael Espindola0e604f92015-09-25 18:56:53 +0000102template <class ELFT>
Rui Ueyama79c73732016-01-08 21:53:28 +0000103SymbolBody *SymbolTable<ELFT>::addAbsolute(StringRef Name, Elf_Sym &ESym) {
104 // Pass nullptr because absolute symbols have no corresponding input sections.
105 auto *Sym = new (Alloc) DefinedRegular<ELFT>(Name, ESym, nullptr);
106 resolve(Sym);
107 return Sym;
Igor Kudrin15cd9ff2015-11-06 07:43:03 +0000108}
109
110template <class ELFT>
Rui Ueyama79c73732016-01-08 21:53:28 +0000111SymbolBody *SymbolTable<ELFT>::addSynthetic(StringRef Name,
112 OutputSectionBase<ELFT> &Section,
113 uintX_t Value) {
Rafael Espindola4d4b06a2015-12-24 00:47:42 +0000114 auto *Sym = new (Alloc) DefinedSynthetic<ELFT>(Name, Value, Section);
Rui Ueyama3ce825e2015-10-09 21:07:25 +0000115 resolve(Sym);
Rui Ueyama79c73732016-01-08 21:53:28 +0000116 return Sym;
Rafael Espindola0e604f92015-09-25 18:56:53 +0000117}
118
Rui Ueyamac9559d92016-01-05 20:47:37 +0000119// Add Name as an "ignored" symbol. An ignored symbol is a regular
120// linker-synthesized defined symbol, but it is not recorded to the output
121// file's symbol table. Such symbols are useful for some linker-defined symbols.
Simon Atanasyan09dae7c2015-12-16 14:45:09 +0000122template <class ELFT>
Rui Ueyamadd7d9982015-12-16 22:31:14 +0000123SymbolBody *SymbolTable<ELFT>::addIgnored(StringRef Name) {
Rafael Espindola65e80b92016-01-19 21:19:52 +0000124 return addAbsolute(Name, ElfSym<ELFT>::Ignored);
Rafael Espindola5d413262015-10-01 21:22:26 +0000125}
126
Rui Ueyamadeb15402016-01-07 17:20:07 +0000127// Rename SYM as __wrap_SYM. The original symbol is preserved as __real_SYM.
128// Used to implement --wrap.
129template <class ELFT> void SymbolTable<ELFT>::wrap(StringRef Name) {
130 if (Symtab.count(Name) == 0)
131 return;
132 StringSaver Saver(Alloc);
133 Symbol *Sym = addUndefined(Name)->getSymbol();
134 Symbol *Real = addUndefined(Saver.save("__real_" + Name))->getSymbol();
135 Symbol *Wrap = addUndefined(Saver.save("__wrap_" + Name))->getSymbol();
136 Real->Body = Sym->Body;
137 Sym->Body = Wrap->Body;
138}
139
Rui Ueyama533336a2015-12-16 22:26:48 +0000140// Returns a file from which symbol B was created.
Rui Ueyama2a65a492016-01-05 20:01:29 +0000141// If B does not belong to any file, returns a nullptr.
Rafael Espindola1a49e582015-09-23 14:10:24 +0000142template <class ELFT>
Rui Ueyama2a65a492016-01-05 20:01:29 +0000143ELFFileBase<ELFT> *SymbolTable<ELFT>::findFile(SymbolBody *B) {
Rui Ueyama533336a2015-12-16 22:26:48 +0000144 for (const std::unique_ptr<ObjectFile<ELFT>> &F : ObjectFiles) {
Rafael Espindola5d7593b2015-12-22 23:00:50 +0000145 ArrayRef<SymbolBody *> Syms = F->getSymbols();
146 if (std::find(Syms.begin(), Syms.end(), B) != Syms.end())
Rui Ueyama533336a2015-12-16 22:26:48 +0000147 return F.get();
Rafael Espindola1a49e582015-09-23 14:10:24 +0000148 }
Rui Ueyama533336a2015-12-16 22:26:48 +0000149 return nullptr;
150}
151
Rui Ueyama71c066d2016-02-02 08:22:41 +0000152// Returns "(internal)", "foo.a(bar.o)" or "baz.o".
153template <class ELFT> static std::string getFilename(ELFFileBase<ELFT> *F) {
154 if (!F)
155 return "(internal)";
156 if (!F->ArchiveName.empty())
157 return (F->ArchiveName + "(" + F->getName() + ")").str();
158 return F->getName();
159}
160
Rui Ueyamab4de5952016-01-08 22:01:33 +0000161// Construct a string in the form of "Sym in File1 and File2".
162// Used to construct an error message.
Rui Ueyama533336a2015-12-16 22:26:48 +0000163template <class ELFT>
164std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Old, SymbolBody *New) {
Rui Ueyama71c066d2016-02-02 08:22:41 +0000165 ELFFileBase<ELFT> *F1 = findFile(Old);
166 ELFFileBase<ELFT> *F2 = findFile(New);
Rui Ueyamaf0904012015-12-16 22:26:45 +0000167 StringRef Sym = Old->getName();
Rui Ueyama71c066d2016-02-02 08:22:41 +0000168 return demangle(Sym) + " in " + getFilename(F1) + " and " + getFilename(F2);
Rafael Espindola1a49e582015-09-23 14:10:24 +0000169}
170
Michael J. Spencer84487f12015-07-24 21:03:07 +0000171// This function resolves conflicts if there's an existing symbol with
172// the same name. Decisions are made based on symbol type.
Rui Ueyama3ce825e2015-10-09 21:07:25 +0000173template <class ELFT> void SymbolTable<ELFT>::resolve(SymbolBody *New) {
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000174 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)) {
Rafael Espindola5d7593b2015-12-22 23:00:50 +0000181 if (auto *Undef = dyn_cast<Undefined>(New)) {
Rui Ueyamac5b95122015-12-16 23:23:14 +0000182 addMemberFile(Undef, L);
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000183 return;
184 }
Rui Ueyamac5b95122015-12-16 23:23:14 +0000185 // Found a definition for something also in an archive.
186 // Ignore the archive definition.
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000187 Sym->Body = New;
188 return;
189 }
190
Rui Ueyama16ba6692016-01-29 19:41:13 +0000191 if (New->isTls() != Existing->isTls()) {
192 error("TLS attribute mismatch for symbol: " + conflictMsg(Existing, New));
193 return;
194 }
Igor Kudrin65bddea2015-10-09 09:58:39 +0000195
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000196 // compare() returns -1, 0, or 1 if the lhs symbol is less preferable,
197 // equivalent (conflicting), or more preferable, respectively.
Rui Ueyama2e0a9ff2016-01-06 00:09:39 +0000198 int Comp = Existing->compare<ELFT>(New);
199 if (Comp == 0) {
Rui Ueyamaf0904012015-12-16 22:26:45 +0000200 std::string S = "duplicate symbol: " + conflictMsg(Existing, New);
Rui Ueyama16ba6692016-01-29 19:41:13 +0000201 if (Config->AllowMultipleDefinition)
202 warning(S);
203 else
204 error(S);
Rui Ueyamaf0904012015-12-16 22:26:45 +0000205 return;
206 }
Rui Ueyama2e0a9ff2016-01-06 00:09:39 +0000207 if (Comp < 0)
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000208 Sym->Body = New;
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000209}
210
Rui Ueyamab4de5952016-01-08 22:01:33 +0000211// Find an existing symbol or create and insert a new one.
Rui Ueyama3ce825e2015-10-09 21:07:25 +0000212template <class ELFT> Symbol *SymbolTable<ELFT>::insert(SymbolBody *New) {
Michael J. Spencer84487f12015-07-24 21:03:07 +0000213 StringRef Name = New->getName();
214 Symbol *&Sym = Symtab[Name];
Rui Ueyama38dcc9e2015-12-16 23:25:31 +0000215 if (!Sym)
Rui Ueyama3554f592015-12-17 00:01:25 +0000216 Sym = new (Alloc) Symbol{New};
Michael J. Spencer84487f12015-07-24 21:03:07 +0000217 New->setBackref(Sym);
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000218 return Sym;
219}
Michael J. Spencer84487f12015-07-24 21:03:07 +0000220
Rui Ueyamaf8432d92015-10-13 16:34:14 +0000221template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name) {
222 auto It = Symtab.find(Name);
223 if (It == Symtab.end())
224 return nullptr;
225 return It->second->Body;
226}
227
Rui Ueyamac5b95122015-12-16 23:23:14 +0000228template <class ELFT> void SymbolTable<ELFT>::addLazy(Lazy *L) {
229 Symbol *Sym = insert(L);
230 if (Sym->Body == L)
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000231 return;
Rafael Espindola5d7593b2015-12-22 23:00:50 +0000232 if (auto *Undef = dyn_cast<Undefined>(Sym->Body)) {
Rui Ueyamac5b95122015-12-16 23:23:14 +0000233 Sym->Body = L;
234 addMemberFile(Undef, L);
Rafael Espindola8614c562015-10-06 14:33:58 +0000235 }
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000236}
237
Rui Ueyama3d451792015-10-12 18:03:21 +0000238template <class ELFT>
Rafael Espindola5d7593b2015-12-22 23:00:50 +0000239void SymbolTable<ELFT>::addMemberFile(Undefined *Undef, Lazy *L) {
Rui Ueyamac5b95122015-12-16 23:23:14 +0000240 // Weak undefined symbols should not fetch members from archives.
241 // If we were to keep old symbol we would not know that an archive member was
242 // available if a strong undefined symbol shows up afterwards in the link.
243 // If a strong undefined symbol never shows up, this lazy symbol will
244 // get to the end of the link and must be treated as the weak undefined one.
245 // We set UsedInRegularObj in a similar way to what is done with shared
246 // symbols and mark it as weak to reduce how many special cases are needed.
247 if (Undef->isWeak()) {
248 L->setUsedInRegularObj();
249 L->setWeak();
250 return;
251 }
252
253 // Fetch a member file that has the definition for L.
Michael J. Spencer1b348a62015-09-04 22:28:10 +0000254 // getMember returns nullptr if the member was already read from the library.
Rui Ueyamac5b95122015-12-16 23:23:14 +0000255 if (std::unique_ptr<InputFile> File = L->getMember())
Rui Ueyama690db672015-10-14 22:32:10 +0000256 addFile(std::move(File));
Michael J. Spencer84487f12015-07-24 21:03:07 +0000257}
Rafael Espindola0e604f92015-09-25 18:56:53 +0000258
Rui Ueyama93bfee52015-10-13 18:10:33 +0000259// This function takes care of the case in which shared libraries depend on
260// the user program (not the other way, which is usual). Shared libraries
261// may have undefined symbols, expecting that the user program provides
262// the definitions for them. An example is BSD's __progname symbol.
263// We need to put such symbols to the main program's .dynsym so that
264// shared libraries can find them.
265// Except this, we ignore undefined symbols in DSOs.
266template <class ELFT> void SymbolTable<ELFT>::scanShlibUndefined() {
Rui Ueyamaf8432d92015-10-13 16:34:14 +0000267 for (std::unique_ptr<SharedFile<ELFT>> &File : SharedFiles)
268 for (StringRef U : File->getUndefinedSymbols())
269 if (SymbolBody *Sym = find(U))
270 if (Sym->isDefined())
Rafael Espindolaabebed92016-02-05 15:27:15 +0000271 Sym->MustBeInDynSym = true;
Rui Ueyamaf8432d92015-10-13 16:34:14 +0000272}
273
Rui Ueyamaf588ac42016-01-06 00:09:41 +0000274template class elf2::SymbolTable<ELF32LE>;
275template class elf2::SymbolTable<ELF32BE>;
276template class elf2::SymbolTable<ELF64LE>;
277template class elf2::SymbolTable<ELF64BE>;