Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -238,9 +238,12 @@ cast(S->body())->File = File; return S; } - if (Binding != STB_WEAK && - (S->body()->isShared() || S->body()->isLazy())) - S->Binding = Binding; + if (Binding != STB_WEAK) { + if (S->body()->isShared() || S->body()->isLazy()) + S->Binding = Binding; + if (auto *SS = dyn_cast>(S->body())) + SS->File->IsUsed = true; + } if (auto *L = dyn_cast(S->body())) { // An undefined weak will not fetch archive members, but we have to remember // its type. See also comment in addLazyArchive. @@ -393,8 +396,11 @@ // Make sure we preempt DSO symbols with default visibility. if (Sym.getVisibility() == STV_DEFAULT) S->ExportDynamic = true; - if (WasInserted || isa(S->body())) + if (WasInserted || isa(S->body())) { replaceBody>(S, F, Name, Sym, Verdef); + if (!S->isWeak()) + F->IsUsed = true; + } } template Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -813,11 +813,6 @@ for (Symbol *S : Symtab.getSymbols()) { SymbolBody *Body = S->body(); - // Set "used" bit for --as-needed. - if (S->IsUsedInRegularObj && !S->isWeak()) - if (auto *SS = dyn_cast>(Body)) - SS->File->IsUsed = true; - // We only report undefined symbols in regular objects. This means that we // will accept an undefined reference in bitcode if it can be optimized out. if (S->IsUsedInRegularObj && Body->isUndefined() && !S->isWeak()) @@ -834,7 +829,8 @@ if (isOutputDynamic() && S->includeInDynsym()) { Out::DynSymTab->addSymbol(Body); if (auto *SS = dyn_cast>(Body)) - Out::VerNeed->addSymbol(SS); + if (SS->File->isNeeded()) + Out::VerNeed->addSymbol(SS); } } Index: test/ELF/verneed-as-needed-weak.s =================================================================== --- /dev/null +++ test/ELF/verneed-as-needed-weak.s @@ -0,0 +1,14 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld %t.o --as-needed %S/Inputs/verneed1.so -o %t +# RUN: llvm-readobj -V %t | FileCheck %s + +# CHECK: SHT_GNU_verneed { +# CHECK-NEXT: } + +.weak f1 + +.globl _start +_start: +.data +.long f1