diff options
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 6 | ||||
-rw-r--r-- | lld/test/elf2/archive.s | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 25ba584d45b..088bf5bca71 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -222,6 +222,12 @@ template <class ELFT> void SymbolTable::resolve(SymbolBody *New) { if (Lazy *L = dyn_cast<Lazy>(Existing)) { if (New->isUndefined()) { + if (New->isWeak()) { + // See the explanation in SymbolTable::addLazy + L->setUsedInRegularObj(); + L->setWeak(); + return; + } addMemberFile(L); return; } diff --git a/lld/test/elf2/archive.s b/lld/test/elf2/archive.s index da78f7aa37c..1ea0908628c 100644 --- a/lld/test/elf2/archive.s +++ b/lld/test/elf2/archive.s @@ -30,4 +30,7 @@ # RUN: lld -flavor gnu2 %tar %t -o %tout # RUN: llvm-nm %tout | FileCheck --check-prefix=AR-FIRST %s -# AR-FIRST: T _start +# AR-FIRST: T _start +# AR-FIRST-NEXT: w bar +# AR-FIRST-NEXT: T end +# AR-FIRST-NEXT: w foo |