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

llvm-svn: 320770
This commit is contained in:
Rui Ueyama 2017-12-15 00:01:33 +00:00
parent 75dfd9a525
commit fbe68a3584
3 changed files with 19 additions and 8 deletions

View File

@ -807,6 +807,12 @@ template <class ELFT> void SharedFile<ELFT>::parseRest() {
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;

View File

@ -495,11 +495,7 @@ void SymbolTable::addShared(StringRef Name, SharedFile<ELFT> *File,
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) {

View File

@ -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