aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-06-28 21:48:33 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-06-28 21:48:33 +0000
commit75edc46551fd5b642049833a0266a798c79ed0b2 (patch)
treeefa7a03b6386e11f0e169c1c1759f8bb632c3053
parent7814d484244884068197fdb26641481fd5078c08 (diff)
Handle empty versions.
They are significant now that we support @ in symbol names. git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@274071 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--ELF/SymbolListFile.cpp7
-rw-r--r--test/ELF/Inputs/empty-ver.ver2
-rw-r--r--test/ELF/empty-ver.s25
3 files changed, 30 insertions, 4 deletions
diff --git a/ELF/SymbolListFile.cpp b/ELF/SymbolListFile.cpp
index fccfd28df..f9a12e2d1 100644
--- a/ELF/SymbolListFile.cpp
+++ b/ELF/SymbolListFile.cpp
@@ -84,6 +84,7 @@ private:
void VersionScriptParser::parseVersion(StringRef Version) {
expect("{");
+ Config->SymbolVersions.push_back(elf::Version(Version));
if (peek() == "global:") {
next();
parseVersionSymbols(Version);
@@ -108,12 +109,10 @@ void VersionScriptParser::parseLocal() {
void VersionScriptParser::parseVersionSymbols(StringRef Version) {
std::vector<StringRef> *Globals;
- if (Version.empty()) {
+ if (Version.empty())
Globals = &Config->VersionScriptGlobals;
- } else {
- Config->SymbolVersions.push_back(elf::Version(Version));
+ else
Globals = &Config->SymbolVersions.back().Globals;
- }
for (;;) {
StringRef Cur = peek();
diff --git a/test/ELF/Inputs/empty-ver.ver b/test/ELF/Inputs/empty-ver.ver
new file mode 100644
index 000000000..7d4b4ede7
--- /dev/null
+++ b/test/ELF/Inputs/empty-ver.ver
@@ -0,0 +1,2 @@
+ver {
+};
diff --git a/test/ELF/empty-ver.s b/test/ELF/empty-ver.s
new file mode 100644
index 000000000..f200d2876
--- /dev/null
+++ b/test/ELF/empty-ver.s
@@ -0,0 +1,25 @@
+// REQUIRES: x86
+// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
+// RUN: ld.lld %t.o -o %t.so -shared -version-script %p/Inputs/empty-ver.ver
+// RUN: llvm-readobj -version-info %t.so | FileCheck %s
+
+// CHECK: Version symbols {
+// CHECK-NEXT: Section Name:
+// CHECK-NEXT: Address:
+// CHECK-NEXT: Offset:
+// CHECK-NEXT: Link:
+// CHECK-NEXT: Symbols [
+// CHECK-NEXT: Symbol {
+// CHECK-NEXT: Version: 0
+// CHECK-NEXT: Name: @
+// CHECK-NEXT: }
+// CHECK-NEXT: Symbol {
+// CHECK-NEXT: Version: 2
+// CHECK-NEXT: Name: foo@ver
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+// CHECK-NEXT: }
+
+
+.global foo@ver
+foo@ver: