diff options
Diffstat (limited to 'lld/ELF/SymbolTable.cpp')
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index ec425cd7e1d1..0dda5dbded47 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -15,9 +15,8 @@ #include "SymbolTable.h" #include "Config.h" -#include "LinkerScript.h" +#include "InputFiles.h" #include "Symbols.h" -#include "SyntheticSections.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Memory.h" #include "lld/Common/Strings.h" @@ -40,9 +39,15 @@ void SymbolTable::wrap(Symbol *sym, Symbol *real, Symbol *wrap) { idx2 = idx1; idx1 = idx3; - if (real->exportDynamic) - sym->exportDynamic = true; - if (!real->isUsedInRegularObj && sym->isUndefined()) + // Propagate symbol usage information to the redirected symbols. + if (sym->isUsedInRegularObj) + wrap->isUsedInRegularObj = true; + if (real->isUsedInRegularObj) + sym->isUsedInRegularObj = true; + else if (!sym->isDefined()) + // Now that all references to sym have been redirected to wrap, if there are + // no references to real (which has been redirected to sym), we only need to + // keep sym if it was defined, otherwise it's unused and can be dropped. sym->isUsedInRegularObj = false; // Now renaming is complete, and no one refers to real. We drop real from @@ -86,18 +91,17 @@ Symbol *SymbolTable::insert(StringRef name) { // when it is a placeholder must be initialized here. sym->setName(name); sym->symbolKind = Symbol::PlaceholderKind; - sym->versionId = VER_NDX_GLOBAL; + sym->partition = 1; sym->visibility = STV_DEFAULT; sym->isUsedInRegularObj = false; sym->exportDynamic = false; sym->inDynamicList = false; - sym->canInline = true; sym->referenced = false; sym->traced = false; sym->scriptDefined = false; + sym->versionId = VER_NDX_GLOBAL; if (pos != StringRef::npos) sym->hasVersionSuffix = true; - sym->partition = 1; return sym; } @@ -107,6 +111,17 @@ Symbol *SymbolTable::addSymbol(const Symbol &newSym) { return sym; } +// This variant of addSymbol is used by BinaryFile::parse to check duplicate +// symbol errors. +Symbol *SymbolTable::addAndCheckDuplicate(const Defined &newSym) { + Symbol *sym = insert(newSym.getName()); + if (sym->isDefined()) + sym->checkDuplicate(newSym); + sym->resolve(newSym); + sym->isUsedInRegularObj = true; + return sym; +} + Symbol *SymbolTable::find(StringRef name) { auto it = symMap.find(CachedHashStringRef(name)); if (it == symMap.end()) |
