diff options
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 4 | ||||
| -rw-r--r-- | lld/test/ELF/shared-lazy.s | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 78e73c27b46..7600698fdb1 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -509,8 +509,8 @@ void SymbolTable::addShared(StringRef Name, SharedFile<ELFT> *File, SymbolBody *Body = S->body(); // An undefined symbol with non default visibility must be satisfied // in the same DSO. - if (WasInserted || - (Body->isUndefined() && Body->getVisibility() == STV_DEFAULT)) { + if (WasInserted || ((Body->isUndefined() || Body->isLazy()) && + Body->getVisibility() == STV_DEFAULT)) { replaceBody<SharedSymbol>(S, File, Name, Sym.st_other, Sym.getType(), &Sym, Verdef); if (!S->isWeak()) diff --git a/lld/test/ELF/shared-lazy.s b/lld/test/ELF/shared-lazy.s new file mode 100644 index 00000000000..bc1e61c3c94 --- /dev/null +++ b/lld/test/ELF/shared-lazy.s @@ -0,0 +1,16 @@ +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o +// RUN: rm -f %t1.a +// RUN: llvm-ar rc %t1.a %t1.o +// RUN: ld.lld %t1.o -o %t1.so -shared +// RUN: echo ".global foo" > %t2.s +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %t2.s -o %t2.o +// RUN: ld.lld %t1.a %t1.so %t2.o -o %t.so -shared +// RUN: llvm-readelf --dyn-symbols %t.so | FileCheck %s + +// Test that 'foo' from %t1.so is used and we don't fetch a member +// from the archive. + +// CHECK: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND foo + +.global foo +foo: |

