diff options
-rw-r--r-- | lld/ELF/SyntheticSections.cpp | 13 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.h | 3 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 8 |
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); |