[lld] r315766 - Give shared symbols priority over lazy ones.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 13 14:52:33 PDT 2017


Author: rafael
Date: Fri Oct 13 14:52:33 2017
New Revision: 315766

URL: http://llvm.org/viewvc/llvm-project?rev=315766&view=rev
Log:
Give shared symbols priority over lazy ones.

This matches the behavior of gold and bfd. It also matches lld's own
behavior when the shared symbol is seen first

Added:
    lld/trunk/test/ELF/shared-lazy.s
Modified:
    lld/trunk/ELF/SymbolTable.cpp

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=315766&r1=315765&r2=315766&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Fri Oct 13 14:52:33 2017
@@ -509,8 +509,8 @@ void SymbolTable::addShared(StringRef Na
   SymbolBody *Body = S->body();
   // An undefined symbol with non default visibility must be satisfied
   // in the same DSO.
-  if (WasInserted ||
-      (Body->isUndefined() && Body->getVisibility() == STV_DEFAULT)) {
+  if (WasInserted || ((Body->isUndefined() || Body->isLazy()) &&
+                      Body->getVisibility() == STV_DEFAULT)) {
     replaceBody<SharedSymbol>(S, File, Name, Sym.st_other, Sym.getType(), &Sym,
                               Verdef);
     if (!S->isWeak())

Added: lld/trunk/test/ELF/shared-lazy.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/shared-lazy.s?rev=315766&view=auto
==============================================================================
--- lld/trunk/test/ELF/shared-lazy.s (added)
+++ lld/trunk/test/ELF/shared-lazy.s Fri Oct 13 14:52:33 2017
@@ -0,0 +1,16 @@
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o
+// RUN: rm -f %t1.a
+// RUN: llvm-ar rc %t1.a %t1.o
+// RUN: ld.lld %t1.o -o %t1.so -shared
+// RUN: echo ".global foo" > %t2.s
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %t2.s -o %t2.o
+// RUN: ld.lld %t1.a %t1.so %t2.o -o %t.so -shared
+// RUN: llvm-readelf --dyn-symbols %t.so | FileCheck %s
+
+// Test that 'foo' from %t1.so is used and we don't fetch a member
+// from the archive.
+
+// CHECK: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT UND foo
+
+.global foo
+foo:




More information about the llvm-commits mailing list