Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -300,9 +300,9 @@ replaceSymbol(S, File, Name, Binding, StOther, Type); return S; } + if (S->isShared() || S->isLazy() || (S->isUndefined() && Binding != STB_WEAK)) + S->Binding = Binding; if (Binding != STB_WEAK) { - if (!S->isDefined()) - S->Binding = Binding; if (auto *SS = dyn_cast(S)) if (!Config->GcSections) SS->getFile()->IsNeeded = true; @@ -310,12 +310,10 @@ if (auto *L = dyn_cast(S)) { // An undefined weak will not fetch archive members. See comment on Lazy in // Symbols.h for the details. - if (Binding == STB_WEAK) { + if (Binding == STB_WEAK) L->Type = Type; - L->Binding = STB_WEAK; - } else if (InputFile *F = L->fetch()) { + else if (InputFile *F = L->fetch()) addFile(F); - } } return S; } @@ -497,8 +495,9 @@ if (WasInserted || ((S->isUndefined() || S->isLazy()) && S->getVisibility() == STV_DEFAULT)) { uint8_t Binding = S->Binding; - replaceSymbol(S, File, Name, Sym.st_other, Sym.getType(), - Sym.st_value, Sym.st_size, Alignment, Verdef); + replaceSymbol(S, File, Name, Sym.getBinding(), Sym.st_other, + Sym.getType(), Sym.st_value, Sym.st_size, + Alignment, Verdef); if (!WasInserted) { S->Binding = Binding; if (!S->isWeak() && !Config->GcSections) Index: ELF/Symbols.h =================================================================== --- ELF/Symbols.h +++ ELF/Symbols.h @@ -209,10 +209,11 @@ public: static bool classof(const Symbol *S) { return S->kind() == SharedKind; } - SharedSymbol(StringRef Name, uint8_t StOther, uint8_t Type, uint64_t Value, - uint64_t Size, uint32_t Alignment, const void *Verdef) - : Symbol(SharedKind, Name, llvm::ELF::STB_WEAK, StOther, Type), - Verdef(Verdef), Value(Value), Size(Size), Alignment(Alignment) { + SharedSymbol(StringRef Name, uint8_t Binding, uint8_t StOther, uint8_t Type, + uint64_t Value, uint64_t Size, uint32_t Alignment, + const void *Verdef) + : Symbol(SharedKind, Name, Binding, StOther, Type), Verdef(Verdef), + Value(Value), Size(Size), Alignment(Alignment) { // GNU ifunc is a mechanism to allow user-supplied functions to // resolve PLT slot values at load-time. This is contrary to the // regualr symbol resolution scheme in which symbols are resolved just Index: test/ELF/relocation-copy-alias.s =================================================================== --- test/ELF/relocation-copy-alias.s +++ test/ELF/relocation-copy-alias.s @@ -61,7 +61,7 @@ // CHECK: Name: b3 // CHECK-NEXT: Value: [[B]] // CHECK-NEXT: Size: 1 -// CHECK-NEXT: Binding: Weak +// CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Object (0x1) // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: .bss