[ELF][test] Add a test about --exclude-libs applying to version symbols
authorFangrui Song <i@maskray.me>
Sat, 23 Jan 2021 02:46:56 +0000 (18:46 -0800)
committerFangrui Song <i@maskray.me>
Sat, 23 Jan 2021 02:46:56 +0000 (18:46 -0800)
D94280 also fixed PR48702.

lld/ELF/Driver.cpp
lld/test/ELF/exclude-libs-versym.s [new file with mode: 0644]

index e0ef61d..3b2a8ba 100644 (file)
@@ -2192,7 +2192,8 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
   compileBitcodeFiles<ELFT>();
 
   // Handle --exclude-libs again because lto.tmp may reference additional
-  // libcalls symbols defined in an excluded archive.
+  // libcalls symbols defined in an excluded archive. This may override
+  // versionId set by scanVersionScript().
   if (args.hasArg(OPT_exclude_libs))
     excludeLibs(args);
 
diff --git a/lld/test/ELF/exclude-libs-versym.s b/lld/test/ELF/exclude-libs-versym.s
new file mode 100644 (file)
index 0000000..1c0bd0a
--- /dev/null
@@ -0,0 +1,32 @@
+# REQUIRES: x86
+## --exclude-libs can hide version symbols.
+
+# RUN: rm -rf %t && split-file %s %t
+# RUN: llvm-mc -filetype=obj %t/a.s -o %t/a.o
+# RUN: llvm-mc -filetype=obj %t/b.s -o %t/b.o
+# RUN: llvm-ar rc %t/b.a %t/b.o
+# RUN: ld.lld -shared %t/a.o %t/b.a --version-script=%t/ver -o %t.so
+# RUN: llvm-readelf --dyn-syms %t.so | FileCheck %s
+# RUN: ld.lld -shared %t/a.o %t/b.a --exclude-libs=b.a --version-script=%t/ver -o %t.so
+# RUN: llvm-readelf --dyn-syms %t.so | FileCheck %s --check-prefix=NO
+
+# CHECK: foo@@v2
+# CHECK: bar@v1
+# NO-NOT: foo@@v2
+# NO-NOT: bar@v1
+
+#--- a.s
+.globl _start
+_start:
+  call foo
+
+#--- b.s
+.symver bar_v1, bar@v1
+.globl foo, bar_v1
+foo:
+bar_v1:
+  ret
+
+#--- ver
+v1 {};
+v2 { foo; };