diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-04-27 20:22:31 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-04-27 20:22:31 +0000 |
commit | 21a12fc69ac28a41efe417ad45ef6aebbb062195 (patch) | |
tree | a31779ec424e285a57b04b0d5db49976cdad14a5 /lld/ELF/Writer.cpp | |
parent | a54132090831711da0b2c96869b48539de2e09a1 (diff) | |
download | bcm5719-llvm-21a12fc69ac28a41efe417ad45ef6aebbb062195.tar.gz bcm5719-llvm-21a12fc69ac28a41efe417ad45ef6aebbb062195.zip |
ELF: Create .gnu.version and .gnu.version_r sections when linking against versioned DSOs.
Differential Revision: http://reviews.llvm.org/D19464
llvm-svn: 267775
Diffstat (limited to 'lld/ELF/Writer.cpp')
-rw-r--r-- | lld/ELF/Writer.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 5caa95a86c1..7799a7030b9 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -132,6 +132,8 @@ template <class ELFT> void elf::writeResult(SymbolTable<ELFT> *Symtab) { StringTableSection<ELFT> DynStrTab(".dynstr", true); StringTableSection<ELFT> ShStrTab(".shstrtab", false); SymbolTableSection<ELFT> DynSymTab(*Symtab, DynStrTab); + VersionTableSection<ELFT> VerSym; + VersionNeedSection<ELFT> VerNeed; OutputSectionBase<ELFT> ElfHeader("", 0, SHF_ALLOC); ElfHeader.setSize(sizeof(Elf_Ehdr)); @@ -195,6 +197,8 @@ 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>::VerSym = &VerSym; + Out<ELFT>::VerNeed = &VerNeed; Out<ELFT>::Bss = nullptr; Out<ELFT>::MipsRldMap = MipsRldMap.get(); Out<ELFT>::Opd = nullptr; @@ -1367,8 +1371,11 @@ template <class ELFT> void Writer<ELFT>::createSections() { if (Out<ELFT>::SymTab) Out<ELFT>::SymTab->addSymbol(Body); - if (isOutputDynamic() && S->includeInDynsym()) + if (isOutputDynamic() && S->includeInDynsym()) { Out<ELFT>::DynSymTab->addSymbol(Body); + if (auto *SS = dyn_cast<SharedSymbol<ELFT>>(Body)) + Out<ELFT>::VerNeed->addSymbol(SS); + } } // Do not proceed if there was an undefined symbol. @@ -1436,6 +1443,10 @@ template <class ELFT> void Writer<ELFT>::addPredefinedSections() { Add(Out<ELFT>::StrTab); if (isOutputDynamic()) { Add(Out<ELFT>::DynSymTab); + if (Out<ELFT>::VerNeed->getNeedNum() != 0) { + Add(Out<ELFT>::VerSym); + Add(Out<ELFT>::VerNeed); + } Add(Out<ELFT>::GnuHashTab); Add(Out<ELFT>::HashTab); Add(Out<ELFT>::Dynamic); |