summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-07-01 11:45:10 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-07-01 11:45:10 +0000
commit33b9de4b32c39db10b86f23233f84663bd2e1ac6 (patch)
treec360bb32026af9f9866dc2c69414f73c1927335e
parentb0b52fc4c6bcfa57336c4cfc99a1c723ff29d75f (diff)
downloadbcm5719-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.h1
-rw-r--r--lld/ELF/OutputSections.cpp29
-rw-r--r--lld/ELF/SymbolListFile.cpp7
-rw-r--r--lld/test/ELF/verdef-defaultver.s1
-rw-r--r--lld/test/ELF/verdef-dependency.s12
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
OpenPOWER on IntegriCloud