summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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