forked from OSchip/llvm-project
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:
parent
75dfd9a525
commit
fbe68a3584
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue