diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-22 16:53:01 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-22 16:53:01 +0000 |
commit | abe21bdf8e3c7be93c9236c3eec47756e14582bb (patch) | |
tree | 957ab78d01784aa3d52722f949adcfd059dbaaae /ELF | |
parent | 1eafc0458f4bb4547fe78c62b78312ad4f719c38 (diff) | |
download | src-abe21bdf8e3c7be93c9236c3eec47756e14582bb.tar.gz src-abe21bdf8e3c7be93c9236c3eec47756e14582bb.zip |
Vendor import of lld release_40 branch r292732:vendor/lld/lld-release_40-r292951vendor/lld/lld-release_40-r292732
Notes
Notes:
svn path=/vendor/lld/dist/; revision=312632
svn path=/vendor/lld/lld-release_40-r292951/; revision=312711; tag=vendor/lld/lld-release_40-r292951
Diffstat (limited to 'ELF')
-rw-r--r-- | ELF/SymbolTable.cpp | 18 | ||||
-rw-r--r-- | ELF/SymbolTable.h | 1 | ||||
-rw-r--r-- | ELF/Symbols.cpp | 7 | ||||
-rw-r--r-- | ELF/Symbols.h | 1 | ||||
-rw-r--r-- | ELF/SyntheticSections.cpp | 4 | ||||
-rw-r--r-- | ELF/Writer.cpp | 4 |
6 files changed, 21 insertions, 14 deletions
diff --git a/ELF/SymbolTable.cpp b/ELF/SymbolTable.cpp index 6afe3dde9bab..ce257933c267 100644 --- a/ELF/SymbolTable.cpp +++ b/ELF/SymbolTable.cpp @@ -140,7 +140,7 @@ template <class ELFT> DefinedRegular<ELFT> *SymbolTable<ELFT>::addIgnored(StringRef Name, uint8_t Visibility) { SymbolBody *S = find(Name); - if (!S || !S->isUndefined()) + if (!S || S->isInCurrentDSO()) return nullptr; return addAbsolute(Name, Visibility); } @@ -283,7 +283,7 @@ static int compareDefined(Symbol *S, bool WasInserted, uint8_t Binding) { if (WasInserted) return 1; SymbolBody *Body = S->body(); - if (Body->isLazy() || Body->isUndefined() || Body->isShared()) + if (Body->isLazy() || !Body->isInCurrentDSO()) return 1; if (Binding == STB_WEAK) return -1; @@ -426,12 +426,8 @@ void SymbolTable<ELFT>::addShared(SharedFile<ELFT> *F, StringRef Name, std::tie(S, WasInserted) = insert(Name, Sym.getType(), STV_DEFAULT, /*CanOmitFromDynSym*/ true, F); // Make sure we preempt DSO symbols with default visibility. - if (Sym.getVisibility() == STV_DEFAULT) { + if (Sym.getVisibility() == STV_DEFAULT) S->ExportDynamic = true; - // Exporting preempting symbols takes precedence over linker scripts. - if (S->VersionId == VER_NDX_LOCAL) - S->VersionId = VER_NDX_GLOBAL; - } if (WasInserted || isa<Undefined<ELFT>>(S->body())) { replaceBody<SharedSymbol<ELFT>>(S, F, Name, Sym, Verdef); if (!S->isWeak()) @@ -468,6 +464,14 @@ template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name) { } template <class ELFT> +SymbolBody *SymbolTable<ELFT>::findInCurrentDSO(StringRef Name) { + if (SymbolBody *S = find(Name)) + if (S->isInCurrentDSO()) + return S; + return nullptr; +} + +template <class ELFT> void SymbolTable<ELFT>::addLazyArchive(ArchiveFile *F, const object::Archive::Symbol Sym) { Symbol *S; diff --git a/ELF/SymbolTable.h b/ELF/SymbolTable.h index 1e5a335acc16..f39dbd1e2e18 100644 --- a/ELF/SymbolTable.h +++ b/ELF/SymbolTable.h @@ -82,6 +82,7 @@ public: void scanVersionScript(); SymbolBody *find(StringRef Name); + SymbolBody *findInCurrentDSO(StringRef Name); void trace(StringRef Name); void wrap(StringRef Name); diff --git a/ELF/Symbols.cpp b/ELF/Symbols.cpp index 289bc18487a8..0fe42be250cf 100644 --- a/ELF/Symbols.cpp +++ b/ELF/Symbols.cpp @@ -203,8 +203,8 @@ void SymbolBody::parseSymbolVersion() { // Truncate the symbol name so that it doesn't include the version string. Name = {S.data(), Pos}; - // If this is an undefined or shared symbol it is not a definition. - if (isUndefined() || isShared()) + // If this is not in this DSO, it is not a definition. + if (!isInCurrentDSO()) return; // '@@' in a symbol name means the default version. @@ -299,7 +299,8 @@ uint8_t Symbol::computeBinding() const { return Binding; if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED) return STB_LOCAL; - if (VersionId == VER_NDX_LOCAL && !body()->isUndefined()) + const SymbolBody *Body = body(); + if (VersionId == VER_NDX_LOCAL && Body->isInCurrentDSO()) return STB_LOCAL; if (Config->NoGnuUnique && Binding == STB_GNU_UNIQUE) return STB_GLOBAL; diff --git a/ELF/Symbols.h b/ELF/Symbols.h index af85dc2b121d..7acb89ad0718 100644 --- a/ELF/Symbols.h +++ b/ELF/Symbols.h @@ -67,6 +67,7 @@ public: return SymbolKind == LazyArchiveKind || SymbolKind == LazyObjectKind; } bool isShared() const { return SymbolKind == SharedKind; } + bool isInCurrentDSO() const { return !isUndefined() && !isShared(); } bool isLocal() const { return IsLocal; } bool isPreemptible() const; StringRef getName() const { return Name; } diff --git a/ELF/SyntheticSections.cpp b/ELF/SyntheticSections.cpp index 5486b38eec10..f09b60b2b494 100644 --- a/ELF/SyntheticSections.cpp +++ b/ELF/SyntheticSections.cpp @@ -883,9 +883,9 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() { add({DT_FINI_ARRAYSZ, Out<ELFT>::FiniArray, Entry::SecSize}); } - if (SymbolBody *B = Symtab<ELFT>::X->find(Config->Init)) + if (SymbolBody *B = Symtab<ELFT>::X->findInCurrentDSO(Config->Init)) add({DT_INIT, B}); - if (SymbolBody *B = Symtab<ELFT>::X->find(Config->Fini)) + if (SymbolBody *B = Symtab<ELFT>::X->findInCurrentDSO(Config->Fini)) add({DT_FINI, B}); bool HasVerNeed = In<ELFT>::VerNeed->getNeedNum() != 0; diff --git a/ELF/Writer.cpp b/ELF/Writer.cpp index bddc42e1acf9..4f2f91993f8d 100644 --- a/ELF/Writer.cpp +++ b/ELF/Writer.cpp @@ -641,7 +641,7 @@ static void addOptionalSynthetic(StringRef Name, OutputSectionBase *Sec, typename ELFT::uint Val, uint8_t StOther = STV_HIDDEN) { if (SymbolBody *S = Symtab<ELFT>::X->find(Name)) - if (S->isUndefined() || S->isShared()) + if (!S->isInCurrentDSO()) Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, StOther); } @@ -661,7 +661,7 @@ static Symbol *addOptionalRegular(StringRef Name, InputSectionBase<ELFT> *IS, SymbolBody *S = Symtab<ELFT>::X->find(Name); if (!S) return nullptr; - if (!S->isUndefined() && !S->isShared()) + if (S->isInCurrentDSO()) return S->symbol(); return addRegular(Name, IS, Value); } |