summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/SymbolTable.cpp15
-rw-r--r--lld/ELF/Symbols.h9
-rw-r--r--lld/test/ELF/relocation-copy-alias.s2
3 files changed, 13 insertions, 13 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 711f46f9400..86c506a2f0f 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -300,9 +300,9 @@ Symbol *SymbolTable::addUndefined(StringRef Name, uint8_t Binding,
replaceSymbol<Undefined>(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<SharedSymbol>(S))
if (!Config->GcSections)
SS->getFile<ELFT>()->IsNeeded = true;
@@ -310,12 +310,10 @@ Symbol *SymbolTable::addUndefined(StringRef Name, uint8_t Binding,
if (auto *L = dyn_cast<Lazy>(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<ELFT>(F);
- }
}
return S;
}
@@ -497,8 +495,9 @@ void SymbolTable::addShared(StringRef Name, SharedFile<ELFT> *File,
if (WasInserted || ((S->isUndefined() || S->isLazy()) &&
S->getVisibility() == STV_DEFAULT)) {
uint8_t Binding = S->Binding;
- replaceSymbol<SharedSymbol>(S, File, Name, Sym.st_other, Sym.getType(),
- Sym.st_value, Sym.st_size, Alignment, Verdef);
+ replaceSymbol<SharedSymbol>(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)
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index 533d43b3bbe..99fc61b963a 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -209,10 +209,11 @@ class SharedSymbol : public Symbol {
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
diff --git a/lld/test/ELF/relocation-copy-alias.s b/lld/test/ELF/relocation-copy-alias.s
index edb1550dd20..ee92047b43f 100644
--- a/lld/test/ELF/relocation-copy-alias.s
+++ b/lld/test/ELF/relocation-copy-alias.s
@@ -61,7 +61,7 @@ movl $5, b2
// 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
OpenPOWER on IntegriCloud