ELF: Set the correct symbol binding.

llvm-svn: 245049
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index e86c9a6..9902cc4 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -12,6 +12,7 @@
 #include "Error.h"
 #include "SymbolTable.h"
 #include "Writer.h"
+#include "Symbols.h"
 
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/Support/FileOutputBuffer.h"
@@ -214,8 +215,24 @@
   llvm::StringTableBuilder &Builder = Table.getStringBuilder();
   for (auto &P : Table.getSymbols()) {
     StringRef Name = P.first;
-    auto *S = reinterpret_cast<Elf_Sym *>(Buf);
-    S->st_name = Builder.getOffset(Name);
+    Symbol *Sym = P.second;
+
+    auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
+    ESym->st_name = Builder.getOffset(Name);
+    uint8_t Binding;
+    switch (Sym->Body->kind()) {
+    case SymbolBody::UndefinedKind:
+      llvm_unreachable("Should be defined by now");
+    case SymbolBody::DefinedRegularKind:
+      Binding = STB_GLOBAL;
+      break;
+    case SymbolBody::UndefinedWeakKind:
+    case SymbolBody::DefinedWeakKind:
+      Binding = STB_WEAK;
+      break;
+    }
+    ESym->setBindingAndType(Binding, 0);
+
     Buf += sizeof(Elf_Sym);
   }
 }
diff --git a/lld/test/elf2/symbols.s b/lld/test/elf2/symbols.s
index e701f6f..148a1b9 100644
--- a/lld/test/elf2/symbols.s
+++ b/lld/test/elf2/symbols.s
@@ -23,7 +23,7 @@
 // CHECK-NEXT:     Name: _start
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local (0x0)
+// CHECK-NEXT:     Binding: Global (0x1)
 // CHECK-NEXT:     Type: None (0x0)
 // CHECK-NEXT:     Other: 0
 // CHECK-NEXT:     Section: Undefined (0x0)
@@ -32,7 +32,7 @@
 // CHECK-NEXT:     Name: foo
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local (0x0)
+// CHECK-NEXT:     Binding: Weak (0x2)
 // CHECK-NEXT:     Type: None (0x0)
 // CHECK-NEXT:     Other: 0
 // CHECK-NEXT:     Section: Undefined (0x0)