[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