diff --git a/lld/ELF/SymbolListFile.cpp b/lld/ELF/SymbolListFile.cpp index fccfd28dff8a..f9a12e2d15eb 100644 --- a/lld/ELF/SymbolListFile.cpp +++ b/lld/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 *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/lld/test/ELF/Inputs/empty-ver.ver b/lld/test/ELF/Inputs/empty-ver.ver new file mode 100644 index 000000000000..7d4b4ede7675 --- /dev/null +++ b/lld/test/ELF/Inputs/empty-ver.ver @@ -0,0 +1,2 @@ +ver { +}; diff --git a/lld/test/ELF/empty-ver.s b/lld/test/ELF/empty-ver.s new file mode 100644 index 000000000000..f200d2876e09 --- /dev/null +++ b/lld/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: