[PATCH] D21439: [ELF] - Handle every global as unversioned export in versioned script.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 16 10:04:34 PDT 2016
grimar created this revision.
grimar added reviewers: rafael, ruiu.
grimar added subscribers: llvm-commits, grimar.
Patch updates the version script parser to parse versioned files.
In a simple way, just adding them to VersionScriptGlobals list.
http://reviews.llvm.org/D21439
Files:
ELF/SymbolListFile.cpp
test/ELF/version-script.s
Index: test/ELF/version-script.s
===================================================================
--- test/ELF/version-script.s
+++ test/ELF/version-script.s
@@ -17,6 +17,28 @@
# RUN: ld.lld --version-script %t.script --dynamic-list %t.list %t.o %t2.so -o %t
# RUN: llvm-readobj -dyn-symbols %t | FileCheck --check-prefix=EXE %s
+# RUN: echo "VERSION_1.0{ \
+# RUN: global: foo1; \
+# RUN: local: *; }; \
+# RUN: VERSION_2.0{ \
+# RUN: global: foo3; \
+# RUN: local: *; }; " > %t4.script
+# RUN: ld.lld --version-script %t4.script -shared %t.o %t2.so -o %t4.so
+# RUN: llvm-readobj -dyn-symbols %t4.so | FileCheck --check-prefix=DSO %s
+
+# RUN: echo "VERSION_1.0{ \
+# RUN: global: foo1; \
+# RUN: local: *; }; \
+# RUN: { \
+# RUN: global: foo3; \
+# RUN: local: *; }; " > %t5.script
+# RUN: not ld.lld --version-script %t5.script -shared %t.o %t2.so -o %t5.so 2>&1 | \
+# RUN: FileCheck -check-prefix=ERR %s
+# ERR: anonymous version tag cannot be combined with other version tag
+
+# RUN: ld.lld --version-script %t.script --dynamic-list %t.list %t.o %t2.so -o %t2
+# RUN: llvm-readobj %t2 > /dev/null
+
# DSO: DynamicSymbols [
# DSO-NEXT: Symbol {
# DSO-NEXT: Name: @ (0)
Index: ELF/SymbolListFile.cpp
===================================================================
--- ELF/SymbolListFile.cpp
+++ ELF/SymbolListFile.cpp
@@ -78,23 +78,34 @@
};
void VersionScriptParser::run() {
- expect("{");
- if (peek() == "global:") {
- next();
- while (!Error) {
- Config->VersionScriptGlobals.push_back(next());
- expect(";");
- if (peek() == "local:")
- break;
+ size_t Id = 0;
+ bool HasAnonymousTag = false;
+ while (!atEOF() && !Error) {
+ if (peek() == "{")
+ HasAnonymousTag = true;
+ else
+ next();
+ if (Id > 0 && HasAnonymousTag)
+ setError("anonymous version tag cannot be "
+ "combined with other version tag");
+
+ expect("{");
+ if (peek() == "global:") {
+ next();
+ while (!Error) {
+ Config->VersionScriptGlobals.push_back(next());
+ expect(";");
+ if (peek() == "local:")
+ break;
+ }
}
+ expect("local:");
+ expect("*");
+ expect(";");
+ expect("}");
+ expect(";");
+ ++Id;
}
- expect("local:");
- expect("*");
- expect(";");
- expect("}");
- expect(";");
- if (!atEOF())
- setError("expected EOF");
}
void elf::parseVersionScript(MemoryBufferRef MB) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21439.60990.patch
Type: text/x-patch
Size: 2574 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160616/c4bf0230/attachment.bin>
More information about the llvm-commits
mailing list