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

llvm-svn: 315766
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 78e73c2..7600698 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -509,8 +509,8 @@
   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())
diff --git a/lld/test/ELF/shared-lazy.s b/lld/test/ELF/shared-lazy.s
new file mode 100644
index 0000000..bc1e61c
--- /dev/null
+++ b/lld/test/ELF/shared-lazy.s
@@ -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: