Use warn() instead of error() to report a bad symbol in a DSO.

Specifically, libwidevinecdm.so in Chrome has such bad symbol.
It seems the BFD linker handles them as local symbols, so instead
of inserting them to the symbol table, we should skip them too.

Differential Revision: https://reviews.llvm.org/D41257

git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@320770 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/ELF/InputFiles.cpp b/ELF/InputFiles.cpp
index f0fcfae..a66c4df 100644
--- a/ELF/InputFiles.cpp
+++ b/ELF/InputFiles.cpp
@@ -807,6 +807,12 @@
       continue;
     }
 
+    if (Sym.getBinding() == STB_LOCAL) {
+      warn("Found local symbol '" + Name +
+           "' in global part of symbol table in file " + toString(this));
+      continue;
+    }
+
     // Ignore local symbols.
     if (Versym && VersymIndex == VER_NDX_LOCAL)
       continue;
diff --git a/ELF/SymbolTable.cpp b/ELF/SymbolTable.cpp
index 71ff936..12509c9 100644
--- a/ELF/SymbolTable.cpp
+++ b/ELF/SymbolTable.cpp
@@ -495,11 +495,7 @@
   if (WasInserted || ((S->isUndefined() || S->isLazy()) &&
                       S->getVisibility() == STV_DEFAULT)) {
     uint8_t Binding = S->Binding;
-    uint8_t OrigBinding = Sym.getBinding();
-    if (OrigBinding == STB_LOCAL)
-      error("Found local symbol '" + Name +
-            "' in global part of symbol table in file " + toString(File));
-    replaceSymbol<SharedSymbol>(S, File, Name, OrigBinding, Sym.st_other,
+    replaceSymbol<SharedSymbol>(S, File, Name, Sym.getBinding(), Sym.st_other,
                                 Sym.getType(), Sym.st_value, Sym.st_size,
                                 Alignment, VerdefIndex);
     if (!WasInserted) {
diff --git a/test/ELF/invalid-local-symbol-in-dso.s b/test/ELF/invalid-local-symbol-in-dso.s
index 0a12e46..e15fc15 100644
--- a/test/ELF/invalid-local-symbol-in-dso.s
+++ b/test/ELF/invalid-local-symbol-in-dso.s
@@ -1,5 +1,14 @@
-# RUN: llvm-mc %s -o %t.o -filetype=obj -triple x86_64-pc-linux
+# REQUIRES: x86
 
 # We used to crash on this
-# RUN: not ld.lld %t.o %p/Inputs/local-symbol-in-dso.so -o %t 2>&1 | FileCheck %s
-# CHECK: Found local symbol 'foo' in global part of symbol table in file {{.*}}local-symbol-in-dso.so
+# RUN: echo | llvm-mc - -o %t1.o -filetype=obj -triple x86_64-pc-linux
+# RUN: ld.lld %t1.o %p/Inputs/local-symbol-in-dso.so -o %t 2>&1 | \
+# RUN:   FileCheck -check-prefix=WARN %s
+# WARN: Found local symbol 'foo' in global part of symbol table in file {{.*}}local-symbol-in-dso.so
+
+# RUN: llvm-mc %s -o %t2.o -filetype=obj -triple x86_64-pc-linux
+# RUN: not ld.lld %t2.o %p/Inputs/local-symbol-in-dso.so -o %t
+
+.globl main
+main:
+  movq foo@GOTTPOFF(%rip), %rax