diff options
author | George Rimar <grimar@accesssoftek.com> | 2016-07-01 11:45:10 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2016-07-01 11:45:10 +0000 |
commit | 33b9de4b32c39db10b86f23233f84663bd2e1ac6 (patch) | |
tree | c360bb32026af9f9866dc2c69414f73c1927335e | |
parent | b0b52fc4c6bcfa57336c4cfc99a1c723ff29d75f (diff) | |
download | bcm5719-llvm-33b9de4b32c39db10b86f23233f84663bd2e1ac6.tar.gz bcm5719-llvm-33b9de4b32c39db10b86f23233f84663bd2e1ac6.zip |
[ELF] - Depricate version references.
This is PR28358
According to
https://www.akkadia.org/drepper/dsohowto.pdf
"The fourth point, the VERS 1.0 version being referred to in the VERS 2.0 definition, is not really important in symbol versioning. It marks the predecessor relationship of the two versions and it is done to maintain the similar- ities with Solaris’ internal versioning. It does not cause any problem it might in fact be useful to a human reader so predecessors should always be mentioned."
Patch partially reverts 273423 "[ELF] - Implemented version script hierarchies.",
version references are just ignored now.
Differential revision: http://reviews.llvm.org/D21888
llvm-svn: 274345
-rw-r--r-- | lld/ELF/Config.h | 1 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 29 | ||||
-rw-r--r-- | lld/ELF/SymbolListFile.cpp | 7 | ||||
-rw-r--r-- | lld/test/ELF/verdef-defaultver.s | 1 | ||||
-rw-r--r-- | lld/test/ELF/verdef-dependency.s | 12 |
5 files changed, 10 insertions, 40 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index a12ff35c4cd..851e150b0bb 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -40,7 +40,6 @@ enum class UnresolvedPolicy { NoUndef, Error, Warn, Ignore }; struct Version { Version(llvm::StringRef Name) : Name(Name) {} llvm::StringRef Name; - llvm::StringRef Parent; std::vector<llvm::StringRef> Globals; size_t NameOff; // Offset in string table. }; diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 4be8447391b..32d48c312b2 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -1488,10 +1488,6 @@ template <class ELFT> void VersionDefinitionSection<ELFT>::finalize() { this->Header.sh_size = (sizeof(Elf_Verdef) + sizeof(Elf_Verdaux)) * getVerDefNum(); - for (Version &V : Config->SymbolVersions) - if (!V.Parent.empty()) - this->Header.sh_size += sizeof(Elf_Verdaux); - this->Header.sh_link = Out<ELFT>::DynStrTab->SectionIndex; this->Header.sh_addralign = sizeof(uint32_t); @@ -1501,22 +1497,12 @@ template <class ELFT> void VersionDefinitionSection<ELFT>::finalize() { this->Header.sh_info = getVerDefNum(); } -static size_t getVersionNameStrTabOffset(StringRef Name) { - for (Version &V : Config->SymbolVersions) - if (V.Name == Name) - return V.NameOff; - error("unknown version name " + Name + " used as a dependency"); - return 0; -} - template <class Elf_Verdef, class Elf_Verdaux> static void writeDefinition(Elf_Verdef *&Verdef, Elf_Verdaux *&Verdaux, uint32_t Flags, uint32_t Index, StringRef Name, - size_t StrTabOffset, StringRef ParentName) { - bool HasParent = !ParentName.empty(); - + size_t StrTabOffset) { Verdef->vd_version = 1; - Verdef->vd_cnt = HasParent ? 2 : 1; + Verdef->vd_cnt = 1; Verdef->vd_aux = reinterpret_cast<char *>(Verdaux) - reinterpret_cast<char *>(Verdef); Verdef->vd_next = sizeof(Elf_Verdef); @@ -1527,12 +1513,6 @@ static void writeDefinition(Elf_Verdef *&Verdef, Elf_Verdaux *&Verdaux, ++Verdef; Verdaux->vda_name = StrTabOffset; - if (HasParent) { - Verdaux->vda_next = sizeof(Elf_Verdaux); - ++Verdaux; - Verdaux->vda_name = getVersionNameStrTabOffset(ParentName); - } - Verdaux->vda_next = 0; ++Verdaux; } @@ -1544,12 +1524,11 @@ void VersionDefinitionSection<ELFT>::writeTo(uint8_t *Buf) { reinterpret_cast<Elf_Verdaux *>(Verdef + getVerDefNum()); writeDefinition(Verdef, Verdaux, VER_FLG_BASE, 1, getFileDefName(), - FileDefNameOff, "" /* Parent */); + FileDefNameOff); uint32_t I = 2; for (Version &V : Config->SymbolVersions) - writeDefinition(Verdef, Verdaux, 0 /* Flags */, I++, V.Name, V.NameOff, - V.Parent); + writeDefinition(Verdef, Verdaux, 0 /* Flags */, I++, V.Name, V.NameOff); Verdef[-1].vd_next = 0; } diff --git a/lld/ELF/SymbolListFile.cpp b/lld/ELF/SymbolListFile.cpp index f9a12e2d15e..bbf9085a1c9 100644 --- a/lld/ELF/SymbolListFile.cpp +++ b/lld/ELF/SymbolListFile.cpp @@ -95,8 +95,13 @@ void VersionScriptParser::parseVersion(StringRef Version) { parseVersionSymbols(Version); expect("}"); + + // Each version may have a parent version. For example, "Ver2" defined as + // "Ver2 { global: foo; local: *; } Ver1;" has "Ver1" as a parent. This + // version hierarchy is, probably against your instinct, purely for human; the + // runtime doesn't care about them at all. In LLD, we simply skip the token. if (!Version.empty() && peek() != ";") - Config->SymbolVersions.back().Parent = next(); + next(); expect(";"); } diff --git a/lld/test/ELF/verdef-defaultver.s b/lld/test/ELF/verdef-defaultver.s index daff826c1f7..f9524d50223 100644 --- a/lld/test/ELF/verdef-defaultver.s +++ b/lld/test/ELF/verdef-defaultver.s @@ -106,7 +106,6 @@ # DSO-NEXT: Index: 3 # DSO-NEXT: Hash: 98456416 # DSO-NEXT: Name: LIBSAMPLE_2.0 -# DSO-NEXT: Predecessor: LIBSAMPLE_1.0 # DSO-NEXT: } # DSO-NEXT: } diff --git a/lld/test/ELF/verdef-dependency.s b/lld/test/ELF/verdef-dependency.s index c40ce3fcadf..92627ddc5c0 100644 --- a/lld/test/ELF/verdef-dependency.s +++ b/lld/test/ELF/verdef-dependency.s @@ -33,7 +33,6 @@ # DSO-NEXT: Index: 3 # DSO-NEXT: Hash: 98456416 # DSO-NEXT: Name: LIBSAMPLE_2.0 -# DSO-NEXT: Predecessor: LIBSAMPLE_1.0 # DSO-NEXT: } # DSO-NEXT: Definition { # DSO-NEXT: Version: 1 @@ -41,16 +40,5 @@ # DSO-NEXT: Index: 4 # DSO-NEXT: Hash: 98456672 # DSO-NEXT: Name: LIBSAMPLE_3.0 -# DSO-NEXT: Predecessor: LIBSAMPLE_2.0 # DSO-NEXT: } # DSO-NEXT: } - -# RUN: echo "LIBSAMPLE_1.0{ \ -# RUN: global: a; \ -# RUN: local: *; }; \ -# RUN: LIBSAMPLE_2.0{ \ -# RUN: global: b; \ -# RUN: local: *; }LIBSAMPLE_X.X; " > %t.script -# RUN: not ld.lld --version-script %t.script -shared %t.o -o %t.so 2>&1 \ -# RUN: | FileCheck -check-prefix=ERR %s -# ERR: unknown version name LIBSAMPLE_X.X used as a dependency |