[lld] r320770 - Use warn() instead of error() to report a bad symbol in a DSO.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 14 16:01:33 PST 2017


Author: ruiu
Date: Thu Dec 14 16:01:33 2017
New Revision: 320770

URL: http://llvm.org/viewvc/llvm-project?rev=320770&view=rev
Log:
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

Modified:
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/test/ELF/invalid-local-symbol-in-dso.s

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=320770&r1=320769&r2=320770&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Thu Dec 14 16:01:33 2017
@@ -807,6 +807,12 @@ template <class ELFT> void SharedFile<EL
       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;

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=320770&r1=320769&r2=320770&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Thu Dec 14 16:01:33 2017
@@ -495,11 +495,7 @@ void SymbolTable::addShared(StringRef Na
   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) {

Modified: lld/trunk/test/ELF/invalid-local-symbol-in-dso.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid-local-symbol-in-dso.s?rev=320770&r1=320769&r2=320770&view=diff
==============================================================================
--- lld/trunk/test/ELF/invalid-local-symbol-in-dso.s (original)
+++ lld/trunk/test/ELF/invalid-local-symbol-in-dso.s Thu Dec 14 16:01:33 2017
@@ -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 at GOTTPOFF(%rip), %rax




More information about the llvm-commits mailing list