[ELF] - Do not allow to mix global symbols versions.
For next version script:
VER1{
global:
a;
};
VER2{
global:
a;
};
gold would produce warning like:
"warning: using 'VER1' as version for 'a' which is also named in version 'VER2' in script."
Documentation also says we do not want this duplications (https://people.freebsd.org/~deischen/symver/library_versioning.txt):
"Note that you do not want to duplicate symbols in the map file. The .symver directives are all that is required to add compatibility
symbols into old versions."
This patch restricts such mixing and makes lld to produce error in this case.
Differential revision: http://reviews.llvm.org/D21555
llvm-svn: 273396
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index c5d9232..65863c1 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -531,8 +531,12 @@
size_t I = 2;
for (Version &V : Config->SymbolVersions) {
for (StringRef Name : V.Globals)
- if (SymbolBody *B = find(Name))
+ if (SymbolBody *B = find(Name)) {
+ if (B->symbol()->VersionId != VER_NDX_GLOBAL &&
+ B->symbol()->VersionId != VER_NDX_LOCAL)
+ error("duplicate symbol " + Name + " in version script");
B->symbol()->VersionId = I;
+ }
++I;
}
}
diff --git a/lld/test/ELF/version-script.s b/lld/test/ELF/version-script.s
index b4b48f2..de8fb35 100644
--- a/lld/test/ELF/version-script.s
+++ b/lld/test/ELF/version-script.s
@@ -47,6 +47,16 @@
# RUN: not ld.lld --version-script %t5.script -shared %t.o %t2.so -o %t5.so 2>&1 | \
# RUN: FileCheck -check-prefix=ERR %s
+# RUN: echo "VERSION_1.0{ \
+# RUN: global: foo1; \
+# RUN: local: *; }; \
+# RUN: VERSION_2.0 { \
+# RUN: global: foo1; \
+# RUN: local: *; }; " > %t6.script
+# RUN: not ld.lld --version-script %t6.script -shared %t.o %t2.so -o %t6.so 2>&1 | \
+# RUN: FileCheck -check-prefix=ERR2 %s
+# ERR2: duplicate symbol foo1 in version script
+
# RUN: ld.lld --version-script %t.script --dynamic-list %t.list %t.o %t2.so -o %t2
# RUN: llvm-readobj %t2 > /dev/null