diff options
| author | George Rimar <grimar@accesssoftek.com> | 2016-06-20 11:55:12 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2016-06-20 11:55:12 +0000 |
| commit | d3566309eb7d12b4c0b3ea9c9f599ec0ce034853 (patch) | |
| tree | ef27be0f35ee33e20947c554fc30eaa9b27cf4b9 /lld/ELF/Writer.cpp | |
| parent | 7b8481bf95b30da7f16fd04c6e88d7b1a80b7f1b (diff) | |
| download | bcm5719-llvm-d3566309eb7d12b4c0b3ea9c9f599ec0ce034853.tar.gz bcm5719-llvm-d3566309eb7d12b4c0b3ea9c9f599ec0ce034853.zip | |
[ELF] - Recommit r273143("[ELF] - Basic versioned symbols support implemented.")
With fix:
-soname flag was not set in testcase. Hash calculated for base def was different on local
and bot machines because filename fos used for calculating.
Initial commit message:
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: 273152
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); |

