aboutsummaryrefslogtreecommitdiff
path: root/lld/ELF/SymbolTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/ELF/SymbolTable.cpp')
-rw-r--r--lld/ELF/SymbolTable.cpp31
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())