diff options
| author | George Rimar <grimar@accesssoftek.com> | 2016-06-20 10:16:33 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2016-06-20 10:16:33 +0000 |
| commit | c31fee22122c0b7546a8f853252456402a226253 (patch) | |
| tree | 92f9c2aead06e9a6d17fb4c46ec26ce7a16550d6 /lld/ELF/Writer.cpp | |
| parent | 06e930d37add0669bc05b2a0311fdf20051f22a8 (diff) | |
| download | bcm5719-llvm-c31fee22122c0b7546a8f853252456402a226253.tar.gz bcm5719-llvm-c31fee22122c0b7546a8f853252456402a226253.zip | |
[ELF] - Basic versioned symbols support implemented.
Patch implements basic support of versioned symbols.
There is no wildcards patterns matching except local: *;
There is no support for hierarchies.
There is no support for symbols overrides (@ vs @@ not handled).
This patch allows programs that using simple scripts to link and run.
Differential revision: http://reviews.llvm.org/D21018
llvm-svn: 273143
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); |

