summaryrefslogtreecommitdiffstats
path: root/lld/ELF/Writer.cpp
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-06-20 10:16:33 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-06-20 10:16:33 +0000
commitc31fee22122c0b7546a8f853252456402a226253 (patch)
tree92f9c2aead06e9a6d17fb4c46ec26ce7a16550d6 /lld/ELF/Writer.cpp
parent06e930d37add0669bc05b2a0311fdf20051f22a8 (diff)
downloadbcm5719-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.cpp13
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);
OpenPOWER on IntegriCloud