diff options
Diffstat (limited to 'lld/ELF/Writer.cpp')
| -rw-r--r-- | lld/ELF/Writer.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 65ddb2010db..d5761e79292 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -136,6 +136,7 @@ template <class ELFT> void elf::writeResult(SymbolTable<ELFT> *Symtab) { std::unique_ptr<StringTableSection<ELFT>> StrTab; std::unique_ptr<SymbolTableSection<ELFT>> SymTabSec; std::unique_ptr<OutputSection<ELFT>> MipsRldMap; + std::unique_ptr<VersionDefinitionSection<ELFT>> VerDef; if (Config->BuildId == BuildIdKind::Fnv1) BuildId.reset(new BuildIdFnv1<ELFT>); @@ -170,6 +171,8 @@ template <class ELFT> void elf::writeResult(SymbolTable<ELFT> *Symtab) { MipsRldMap->setSize(sizeof(uintX_t)); MipsRldMap->updateAlignment(sizeof(uintX_t)); } + if (!Config->SymbolVersions.empty()) + VerDef.reset(new VersionDefinitionSection<ELFT>()); Out<ELFT>::Bss = &Bss; Out<ELFT>::BuildId = BuildId.get(); @@ -189,6 +192,7 @@ template <class ELFT> void elf::writeResult(SymbolTable<ELFT> *Symtab) { Out<ELFT>::ShStrTab = &ShStrTab; Out<ELFT>::StrTab = StrTab.get(); Out<ELFT>::SymTab = SymTabSec.get(); + Out<ELFT>::VerDef = VerDef.get(); Out<ELFT>::VerSym = &VerSym; Out<ELFT>::VerNeed = &VerNeed; Out<ELFT>::MipsRldMap = MipsRldMap.get(); @@ -904,10 +908,15 @@ template <class ELFT> void Writer<ELFT>::addPredefinedSections() { Add(Out<ELFT>::StrTab); if (isOutputDynamic()) { Add(Out<ELFT>::DynSymTab); - if (Out<ELFT>::VerNeed->getNeedNum() != 0) { + + bool HasVerNeed = Out<ELFT>::VerNeed->getNeedNum() != 0; + if (Out<ELFT>::VerDef || HasVerNeed) Add(Out<ELFT>::VerSym); + if (Out<ELFT>::VerDef) + Add(Out<ELFT>::VerDef); + if (HasVerNeed) Add(Out<ELFT>::VerNeed); - } + Add(Out<ELFT>::GnuHashTab); Add(Out<ELFT>::HashTab); Add(Out<ELFT>::Dynamic); |

