summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/SyntheticSections.cpp13
-rw-r--r--lld/ELF/SyntheticSections.h3
-rw-r--r--lld/ELF/Writer.cpp8
3 files changed, 11 insertions, 13 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 4faaf47a360..b3ba7499c8f 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -301,7 +301,7 @@ SymbolBody *elf::addSyntheticLocal(StringRef Name, uint8_t Type, uint64_t Value,
auto *S = make<DefinedRegular<ELFT>>(Name, /*IsLocal*/ true, STV_DEFAULT,
Type, Value, Size, Section, nullptr);
if (In<ELFT>::SymTab)
- In<ELFT>::SymTab->addLocal(S);
+ In<ELFT>::SymTab->addSymbol(S);
return S;
}
@@ -1341,13 +1341,12 @@ template <class ELFT> void SymbolTableSection<ELFT>::finalizeContents() {
this->OutSec->Info = NumLocals + 1;
}
-template <class ELFT> void SymbolTableSection<ELFT>::addGlobal(SymbolBody *B) {
- Symbols.push_back({B, StrTabSec.addString(B->getName(), false)});
-}
+template <class ELFT> void SymbolTableSection<ELFT>::addSymbol(SymbolBody *B) {
+ // Adding a local symbol to a .dynsym is a bug.
+ assert(this->Type != SHT_DYNSYM || !B->isLocal());
-template <class ELFT> void SymbolTableSection<ELFT>::addLocal(SymbolBody *B) {
- assert(!StrTabSec.isDynamic());
- Symbols.push_back({B, StrTabSec.addString(B->getName())});
+ bool HashIt = B->isLocal();
+ Symbols.push_back({B, StrTabSec.addString(B->getName(), HashIt)});
}
template <class ELFT>
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
index 662c241cabc..8e847a959ef 100644
--- a/lld/ELF/SyntheticSections.h
+++ b/lld/ELF/SyntheticSections.h
@@ -417,8 +417,7 @@ public:
void finalizeContents() override;
void writeTo(uint8_t *Buf) override;
size_t getSize() const override { return getNumSymbols() * sizeof(Elf_Sym); }
- void addGlobal(SymbolBody *Body);
- void addLocal(SymbolBody *Body);
+ void addSymbol(SymbolBody *Body);
unsigned getNumSymbols() const { return Symbols.size() + 1; }
size_t getSymbolIndex(SymbolBody *Body);
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 127bfdc249f..07e5a3de558 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -518,7 +518,7 @@ template <class ELFT> void Writer<ELFT>::copyLocalSymbols() {
InputSectionBase *Sec = DR->Section;
if (!shouldKeepInSymtab<ELFT>(Sec, B->getName(), *B))
continue;
- In<ELFT>::SymTab->addLocal(B);
+ In<ELFT>::SymTab->addSymbol(B);
}
}
}
@@ -537,7 +537,7 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() {
DefinedRegular<ELFT>("", /*IsLocal=*/true, /*StOther*/ 0, STT_SECTION,
/*Value*/ 0, /*Size*/ 0, IS, nullptr);
- In<ELFT>::SymTab->addLocal(B);
+ In<ELFT>::SymTab->addSymbol(B);
}
}
@@ -1104,10 +1104,10 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
if (!includeInSymtab<ELFT>(*Body))
continue;
if (In<ELFT>::SymTab)
- In<ELFT>::SymTab->addGlobal(Body);
+ In<ELFT>::SymTab->addSymbol(Body);
if (In<ELFT>::DynSymTab && S->includeInDynsym()) {
- In<ELFT>::DynSymTab->addGlobal(Body);
+ In<ELFT>::DynSymTab->addSymbol(Body);
if (auto *SS = dyn_cast<SharedSymbol>(Body))
if (cast<SharedFile<ELFT>>(SS->File)->isNeeded())
In<ELFT>::VerNeed->addSymbol(SS);
OpenPOWER on IntegriCloud