[PATCH] D21555: [ELF] - Do not allow duplicate global symbols version.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 21 06:11:47 PDT 2016


grimar created this revision.
grimar added reviewers: ruiu, rafael.
grimar added subscribers: llvm-commits, grimar.
Herald added a subscriber: emaste.

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 'VER1' 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."

So I suggest to error out such cases.

http://reviews.llvm.org/D21555

Files:
  ELF/SymbolTable.cpp
  test/ELF/version-script.s

Index: test/ELF/version-script.s
===================================================================
--- test/ELF/version-script.s
+++ 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
 
Index: ELF/SymbolTable.cpp
===================================================================
--- ELF/SymbolTable.cpp
+++ ELF/SymbolTable.cpp
@@ -531,8 +531,11 @@
   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)
+          error("duplicate symbol " + Name + " in version script");
         B->symbol()->VersionId = I;
+      }
     ++I;
   }
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21555.61362.patch
Type: text/x-patch
Size: 1354 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160621/4cc05ded/attachment.bin>


More information about the llvm-commits mailing list